算法中的字符串问题(JAVA)
今天做到了一道算法题,如下:求两个字符串的最大共子串长度,如"abcdkkk"和 "baabcdadabc",可以找到最长的公共子串是“abcd”,所以最大公共子串长度为4。
由这道题加上对一些资料的参考引发了我对几个问题的思考:
1.一个字符串的非空子串的求法
static void getAllStr(String all){ String current = "" ; int sum=0; System.out.print("字符串"+all+"的所有非空子串有:"); for (int i = 0; i < all.length(); i++) { for (int begin = 0, end = all.length() - i; end <= all.length(); begin++, end++) { current = all.substring(begin, end); sum++; System.out.print(current+" "); } } System.out.println(" 个数为:"+sum); }
运行结果:
上面第二个for循环也就是
for (int begin = 0, end = all.length() - i; end <= all.length(); begin++, end++)
特别值得注意,感觉很巧妙,就像是一个长度依次减小的窗口在从头到尾不停滑动,优点在于可以很快的求到字符串的最长子串与其他字符串匹配,并且可以直接找到长度。
遍历过程分析如下图:
2.非空子串求到了,但也许会有一些相同的值,也就出现了字符串数组如何去掉重复值
去掉重复值的方法很多,这里记录一种才get到的简单方法,直接使用set类,它自动帮你去掉了重复。。。代码如下:
static void delDuplicate(String str[]){ TreeSet<String> tr = new TreeSet<String>(); System.out.print("去重之前:"); for(String x:str){ System.out.print(x+" "); } for(int i=0;i<str.length;i++){ tr.add(str[i]); } String str2[]=new String[tr.size()]; System.out.print(" 去重之后: "); for(int i=0;i<str2.length;i++){ str2[i]=tr.pollFirst(); System.out.print(str2[i]+" "); } }
3.字符串匹配问题
当求出字符串的子串过后再来做匹配字符串就更简单了,只需要先做一些判断再调用String类的contains()方法即可,代码如下:
static int f(String s1, String s2) { // 参数检查 if (s1 == null || s2 == null) { return 0; } String max = ""; String min = ""; if (s1.length() < s2.length()) { min = s1; max = s2; } else { min = s2; max = s1; } // 记录当前字符串 String current = ""; for (int i = 0; i < min.length(); i++) { for (int begin = 0, end = min.length() - i; end <= min.length(); begin++, end++) { current = min.substring(begin, end); if (max.contains(current)) { return current.length(); } } } return 0; }
当然,匹配字符串还有其他一些方法,比如蓝桥杯的题目是一道填空题,它给出的代码就是一个动态规划的思路,动态规划需要掌握的更多,留待下次总结。
(PS:小白第一次发文,不对的地方恳请大佬纠正~~此文参考了一些他人的代码(感谢!)+自己的心得总结,如有雷同不必在意)