最长公共子串(图文版)

Posted dgwblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子串(图文版)相关的知识,希望对你有一定的参考价值。

PS:串一定是连续的,序列可以是不连续的

时间复杂度O(len1*len2)

问题:求2个字符串的最长公共子串


  1. 字符串 str1="abcde"str2="abcde"

如果两个串相同,那么矩阵的对角线全都是1。
技术图片

  1. 1abcdefg,串2acdaefg

技术图片
为了在求最长公共子串时,使得判断更加简单,我们把上图改成下图。

技术图片

JavaCode:

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        char[] str1 = reader.readLine().toCharArray();
        char[] str2 = reader.readLine().toCharArray();
        
        int str1len=str1.length;
        int str2len=str1.length;
        
        int [][] dp=new int[100][100];
        
        int maxlen=0,endinx=0;
        
        for (int i = 0; i < str1len; i++) {
            for (int j = 0; j < str2len; j++) {
                if(str1[i]==str2[i]) {
                    if(i==0||j==0) dp[i][j]=1;    // 如果是在行头或列头,表示开始位置,所以赋值为1 第一次出现
                    else dp[i][j]=dp[i-1][j-1]+1; //第二次出现相同字符
                }else {
                    dp[i][j]=0; // 否则就是字符不同,赋值为0
                }
                if(dp[i][j]>maxlen) {
                    maxlen=dp[i][j];  // 获取最长公共子串的最大长度
                    // 获取串1的最长公共子串最后一个字符的下标
                    endinx=i;
                }
            }
        }
        // 输出最长公共子串,注意起点和终点
        for(int i=endinx-maxlen+1;i<endinx;i++) {
            System.out.print(str1[i]);
        }
    }
}

 

以上是关于最长公共子串(图文版)的主要内容,如果未能解决你的问题,请参考以下文章

动态规划——最长公共子序列与最长公共子串 (含Python实现代码)

两个字符串的最长公共子串python代码

最长公共子串与最长公共子序列

最长公共子序列

[程序员代码面试指南]递归和动态规划-最长公共子串问题

求两个字符串的最长公共子串,要求输入两个字符串,输出他们的最长公共子串,包括长度。