最近在重温String相关的方法,其中的一道算法题,获取两个字符串中最大子串,觉得比较有意思,于是在网上搜了一下相关文章,虽然都实现了并且查找到了最大子串,但没有考虑到同时存在多个最大子串的情况,下面根据尚硅谷宋老师的教学视频,对此算法进行一个记录,代码如下:
import java.util.Arrays;
/**
* @description 获取两个字符串中最大相同子串
*/
public class GetMaxString {
public static void main(String args[]) {
String s1 = "qwerabcdtyuiopqwer";
String s2 = "xcabcdvbnqwer";
String []s = getMaxSameString(s2, s1);
System.out.println(Arrays.toString(s));
}
public static String[] getMaxSameString(String str1, String str2) {
// 判断str1,str2不能为空,为空则返回null
if(null == str1 || "".equals(str1) || null == str2 || "".equals(str2)) {
return null;
}
String max = null, min = null;
// 判断str1和str2的长度,长的字符作为max字符,用来包含短的字符min字符
max = str1.length() > str2.length() ? str1 : str2;
min = str1.length() > str2.length() ? str2 : str1;
System.out.println("maxStr:" + max);
System.out.println("minStr:" + min);
StringBuilder ab = new StringBuilder();
// 外层循环,用来循环min字符串,用来控制内循环中,最大子串的长度
for (int i = 0; i < min.length(); i++) {
// 内层循环,每次从min字符串的0下标开始,到min长度-i,进行截取,获取最大子串;
// b <= min.length(),用来控制截取的长度超过min.length(),导致无意义或者出现bug;
// 第一次是截取min.substring(0,min.length()),即整个min字符串的长度;
// 第二次是截取min.substring(0,min.length()-1),min.substring(1,min.length()),两个最大子串;
// 第三次是截取min.substring(0,min.length()-2),min.substring(1,min.length()-1),min.substring(2,min.length()),三个最大子串;
// 依次类推,依次查找从大到小的子串,直至找到最大的子串,写入输出结果中,break终止循环
for(int a = 0,b = min.length()-i; b <= min.length(); a++,b++){
// 截取字符串
String sub = min.substring(a, b);
// 是否包含字符串
if(max.contains(sub)) {
ab.append(sub + ",");
}
}
// 最大子串结果集不为空,则表示已找到最大子串,break终止循环
if(ab.length() != 0) {
break;
}
}
// 可能包含多个最大子串,分隔成数组
String [] split = ab.substring(0, ab.length() - 1).split(",");
return split;
}
}
具体思路及过程,已在代码注释中描述,看一下运行结果:
"C:\Program Files (x86)\Java\jdk1.8.0_131\bin\java.exe" ...
minStr:xcabcdvbnqwer
[abcd, qwer]
从结果上可以看到,可以获取到最大相同子串,并且可以获取到多个最大子串。