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的位置。