最長公共子串(圖文版)


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]);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM