您的位置:首页 > 其它

lintcode :longest common substring 最长公共子串

2016-01-15 20:03 555 查看
题目

最长公共子串

给出两个字符串,找到最长公共子串,并返回其长度。

样例

给出A=“ABCD”,B=“CBCE”,返回 2

注意

子串的字符应该连续的出现在原字符串中,这与子序列有所不同。

解题

注意:

子序列:这个序列不是在原字符串中连续的位置,而是有间隔的,如:ABCDE 和AMBMCMDMEM 最长公共子序列是ADCDE

子串:子串一定在原来字符串中连续存在的。如:ABCDEF 和SSSABCDOOOO最长公共子串是ABCD

参考链接,讲解很详细

根据子串定义,暴力破解

public class Solution {
/**
* @param A, B: Two string.
* @return: the length of the longest common substring.
*/
public int longestCommonSubstring(String A, String B) {
// write your code here
if(A == null || B == null ||A.length() ==0 || B.length() ==0)
return 0;
int lenA = A.length();
int lenB = B.length();
int [][] C = new int[lenA ][lenB ];
int longest = -1;
for(int i=0;i<lenA;i++){
for(int j= 0;j< lenB;j++){
char ch1 = A.charAt(i);
char ch2 = B.charAt(j);
if( ch1 == ch2){
C[i][j] = 1;
}else{
C[i][j] = 0;
}

}
}
for(int i =0;i< lenA;i++){
for(int j=0;j<lenB;j++){
int m = i;
int n = j;
int sublongest = 0;
while(m<lenA && n <lenB){
if(C[m]
==1){
sublongest +=1;
m++;
n++;
}else{
break;
}
}
longest = Math.max(longest,sublongest);
}
}

return longest;

}
}


Java Code
上面的动态规划解法是在求出数组的同时求对角线上1的个数,上面的分开计算更容易理解,更容易想到动态规划的解法。

上面博客还要其他方法,待更新。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: