设置一个标志数组用来记录每个字符与另外一个串匹配的结果,循环另一个串得到最长的匹配结果
public static void main(String[] args)
{
// try {
// BufferedReader strin=new BufferedReader(new InputStreamReader(System.in));
// System.out.print("请输入一个字符串:");
// String str = strin.readLine();
//
// System.out.println("第一个:"+str);
//
// System.out.println("请输入第二个字符串:");
// String str2 = strin.readLine();
// System.out.println("第2个:"+str2);
// } catch (IOException e) {
// e.printStackTrace();
// }
Scanner sc = new Scanner(System.in);
System.out.println("输入两个字符串:");
// System.out.println("输入字符串:"+sc.next());
String str1 = sc.nextLine();
String str2 = sc.nextLine();
String maxCommonStr = getCommonStr(str1, str2);
System.out.println("maxCommonStr:" + maxCommonStr);
}
public static String getCommonStr(String s1, String s2){
if (s1 == null || s2 == null) {
return null;
}
int length = s1.length();
int maxLength = 0, maxLoc = 0; //分别记录匹配的最大长度和最大长度的位置
int[] array = new int[length];
for (int i = 0; i < s2.length(); i++) { //循环一个字符串
for (int j = length - 1; j >= 0; j--) { //与另一个字符串依次比较
if (s2.charAt(i) == s1.charAt(j)) { //若字符相等
if (j == 0) { //若为第一个字符,则设置标志数组第一位为1
array[j] = 1;
}
else { //若不为第一个字符,则设置标志数组该位为前一位的值加1
array[j] = array[j-1] + 1;
}
if (array[j] > maxLength) { //若该匹配长度大于最大匹配长度,则记录长度和位置,循环完以此来得到最大长度子串
maxLength = array[j];
maxLoc = j;
}
}
else { //若字符不相等,置标志数组该位为0
array[j] = 0;
}
}
}
return s1.substring(maxLoc - maxLength + 1, maxLoc + 1);
}