在网上找配一票解题思路,感觉这个还是很清晰,学习一下
转自:http://blog.csdn.net/u014762921/article/details/55807193
1、 首先区别最长公共子串和最长公共子序列
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。
2、 最长公共子串
其实这是一个序贯决策问题,可以用动态规划来求解。使用一个二维矩阵来记录中间结果。
eg: abcd和bca
例 | a | b | c | d |
b | 0 | 1 | 0 | 0 |
c | 0 | 0 | 2 | 0 |
a | 1 | 0 | 0 | 0 |
public int longestCommonSubstring(String A, String B) { //记录最长子串大小 int max=0; char[] AStr=A.toCharArray(); char[] BStr=B.toCharArray(); int lenA=AStr.length; int lenB=BStr.length; //记录最长子串结束的位置 int x=0; int y=0; //初始化矩阵 int a[][]=new int[lenA][lenB]; for (int i=0;i<lenA;i++){ for (int j=0;j<lenB;j++){ if (AStr[i]==BStr[j]){ if (i==0||j==0){ a[i][j]=1; }else { a[i][j]=a[i-1][j-1]+1; } if (a[i][j]>max){ max=a[i][j]; x=i; y=j; } }else { a[i][j]=0; } } } return max; }