PS:串一定是連續的,序列可以是不連續的
時間復雜度O(len1*len2)
問題:求2個字符串的最長公共子串
-
字符串 str1="abcde",str2="abcde"
如果兩個串相同,那么矩陣的對角線全都是1。
-
串1是abcdefg,串2是acdaefg
為了在求最長公共子串時,使得判斷更加簡單,我們把上圖改成下圖。
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]); } } }