问题
获取两个字符串中最大相同字串。比如:str1=“abcwerthelloyuiodef12345”,str=“cvghellobnm12345”
提示:将短的那个串进行长度依次递减的子串与较长串比较
代码及解析
import org.junit.Test;
import java.util.Arrays;
/**
* @author JiaMing
* @create 08-22 18:05
* @description 获取两个字符串中最大相同字串。比如:str1="abcwerthelloyuiodef12345",str="cvghellobnm12345"
* 提示:将短的那个串进行长度依次递减的子串与较长串比较
*/
public class Exer5 {
public String maxSubString(String s1, String s2){
//由于可能存在多个长度相同的最大相同子串,因此创建builder等会方便存进去,不用数组存是因为不知道有几个最大相同子串,所以不知道数组的长度该创建多大
StringBuilder builder = new StringBuilder();
//先选出哪个长哪个短
String maxStr = s1.length() >= s2.length() ? s1 : s2;
String minStr = s1.length() < s2.length() ? s1 : s2;
//外层循环逐次加一
for (int i = 0; i < maxStr.length(); i++) {
//内层循环的意思是:第一次比较的是subStr即"cvghellobnm12345",maxStr不包含subStr
//第二次比较的是:subStr="cvghellobnm1234","vghellobnm12345",maxStr不包含subStr
//第三次比较的是:subStr="cvghellobnm123","vghellobnm1234","ghellobnm12345",maxStr不包含subStr
//...这样依次循环
for (int x=0,y=minStr.length()-i; y<=minStr.length(); x++,y++) {
String subStr=minStr.substring(x,y);
if(maxStr.contains(subStr)){
//如果maxStr包含subStr,则存到builder中,并且把此次循环继续执行,看看是否有多个长度相同的最大相同子串并存到builder中
builder.append(subStr+",");
}
}
//当这一次的内层循环结束并且builder中已经有最大子串时,则结束外层循环,不需要再找了
if(builder.length()!=0){
break;
}
}
//先把builder转换成String类型,再去掉最后的"," 然后并切片成多份,命名到数组中
String[] split = builder.toString().replaceAll(",$", "").split("\\,");
return Arrays.toString(split);//将数组转换成String类型并返回
}
@Test
public void test() {
String str1="abcwerthelloyuiodef12345";
String str2="cvghellobnm12345";
String maxSubString = maxSubString(str1, str2);
System.out.println(maxSubString);
}
}