题目描述:
求两个输入序列的最长的公共子字符串的长度。子字符串中的所有字符在源字符串中必须相邻。 如字符串:21232523311324和字符串312123223445,他们的最长公共子字符串为21232,长度为5。
最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:
子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。
动态转移方程为:
如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1
如果xi ! = yj, 那么c[i][j] = 0
最后求Longest Common Substring的长度等于 max{ c[i][j], 1<=i<=n, 1<=j<=m}
1 public class Dp { 2 public static void main(String[] args) { 3 String oneString = "123abc"; 4 String twoString = "ab123abc"; 5 char[] s1 = oneString.toCharArray(); 6 char[] s2 = twoString.toCharArray(); 7 int[][] ans = new int[s2.length + 1][s1.length + 1]; 8 int max=0; //记录最长长度 9 int maxi=0; //记录下标 10 for (int i = 0; i < s2.length; i++) { 11 for (int j = 0; j < s1.length; j++) { 12 if (s2[i] == s1[j]) { 13 ans[i+1][j+1]=ans[i][j]+1; 14 if(max<ans[i+1][j+1]) {max=ans[i+1][j+1];maxi=i+1;} 15 } else { 16 ans[i+1][j+1]=0; 17 } 18 } 19 } 20 System.out.println("最长公共子串的长度为:"+max); 21 System.out.println("最长公共字串为:"+twoString.substring(maxi-max, maxi)); 22 } 23 }
结果:
最长公共子串的长度为:6
最长公共字串为:123abc
时间: 2024-10-06 12:29:08