62,614
社区成员
发帖
与我相关
我的任务
分享
public class Test {
public Test() {
// TODO Auto-generated constructor stub
}
public static Set<String> maxCommonStr(String str1, String str2){
if(str1 == null || str2 == null){
return null;
}
if("".equals(str1) || "".equals(str2)){
return null;
}
//此算法选择长度短的字符串作外循环比较字符串,因为公共字符串的长度肯定小于短的字符串。
if(str1.length() > str2.length()){
String shortStr;
shortStr = str2;
str2 = str1;
str1 = shortStr;
}
String tempStr;
Set<String> set = new HashSet<String>();
boolean hasFinded = false;
//外层循环控制比较字符串的长度。
for(int i=str1.length();i>=1;i--){
//内层循环负责遍历所有当前长度的字符串。
for(int j=0;(j+i)<=str1.length();j++){
tempStr = str1.substring(j, j+i);
if(str2.contains(tempStr)){
set.add(tempStr);
//由于可能有其它相同长度的公共字符串,所以找到一个后本层循环不能退出。
hasFinded = true;
}
}
if(hasFinded){
break;
}
}
return set;
}
public static void main(String[] args) {
String str1 = "12ABCDEFG23457";
String str2 = "ABCDEQW23457E57";
Set<String> set = Test.maxCommonStr(str1, str2);
if(set == null || set.size() == 0){
System.out.println("报告!没有发现公共字符串!");
}else{
for(String str : set){
System.out.println(str);
}
}
}
}
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
String s1 = "ABCDEFG";
String s2 ="ABCDEQWE ";
label:
for (int subStrLength = s1.length(); subStrLength > 0; subStrLength--)
for (int index = 0; index + subStrLength <= s1.length(); index++) {
//两层循环的意思把第一个字符串s1拆分
//长度为7:ABCDEFG,长度为6:BCDEFG,ABCDEF,长度为5,ABCDE,BCDEF,CDEFG...长度为1,A,B,C,D,E,F,G
//把拆分的字符串赋给变量subString
String subString = s1.substring(index, index+subStrLength);
//可以把下面代码注释掉,打印出subString的值:System.out.println(subStrLength + ":" + subString);
if (-1 != s2.indexOf(subString)) {
//如果在第二个字符串中找到了拆分好的字符串subString,那么subString就是最长的公共子串,然后跳出所有的循环
System.out.println(subString);
break label;
}
}
}
}