题解 | #公共子串计算#

公共子串计算

http://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b

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

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务