import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str1 = null;
String str2 = null;
String str3 = null;
int offset = 0;
int max = 0;
int len1 = 0;
int len2 = 0;
while (in.hasNext()) {
str1 = in.nextLine();
str2 = in.nextLine();
max = 0;
if (str1.length() >= str2.length()) {//确保左边的字符串更短
str3 = str1;
str1 = str2;
str2 = str3;
}
char[] char1 = str1.toCharArray();
char[] char2 = str2.toCharArray();
len1 = char1.length;
len2 = char2.length;
for (int i = 0; i < len1; i++) {
offset = 0;
for (int j = 0; j < len2; j++) {
if (char1[i] == char2[j]) {
offset = 1;
while (i < len1 - offset && j < len2 - offset) {
if (char1[i + offset] == char2[j + offset]) {
offset++;//获取到相同的位数
if(max<offset){
max=offset;//获取到最大相同位数
}
} else break;
}
}
}
}
System.out.println(max);
}
}
}先上代码。遇到这类问题首先想到的就是遍历。最理想的情况是公共字符串的长度=输入的比较短的那个字符串的长度,所以笔者先将输入的字符串进行了排序以确保str1比str2短。那么后续遍历时外层for循环的次数一定是不会超过str1的字符个数的。遍历当然需要把字符串转化为字符数组。
如果遍历单个字符就没有相同的,那么肯定是不会有公共的字符串,直接输出0即可。只有出现了第一次相同的字符才可能有连续相同这回事。故笔者使用了偏移量来记录连续相同的个数,同时也可以起到控制脚标的作用,对比的2个字符数组的偏移量肯定是相同的。
不清楚循环次数的情况下就选用while死循环,边界条件是数组到头时,一定要小心计算防止出现数组越界。中断条件是比较的结果为不相同。获得了每次遍历的相同个数后还需要保存最大值,这个很简单,但是要注意max=offset的位置。

京公网安备 11010502036488号