算法中的字符串问题(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:小白第一次发文,不对的地方恳请大佬纠正~~此文参考了一些他人的代码(感谢!)+自己的心得总结,如有雷同不必在意)
