您的位置:首页 > 其它

(79)最长公共子串

2015-10-20 15:09 375 查看


中等 最长公共子串

30%

通过

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

您在真实的面试中是否遇到过这个题? 

Yes

样例

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

注意

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

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int findthelongest(char s1[],char s2[])
{
int max = 0;
int i,j;
int len1 = strlen(s1);
int len2 = strlen(s2);
int table[len1+10][len2+10];
for(i=0;i<len2;i++)
{
if(s1[0]==s2[i])
table[0][i] = 1;
else table[0][i] = 0;
}
for(i=0;i<len1;i++)
{
table[i][0] = (s1[i]==s2[0]?1:0);
}
for(i=1;i<len1;i++)
{
for(j=1;j<len2;j++)
{
if(s1[i]==s2[j])
table[i][j] = table[i-1][j-1]+1;
else{
if(table[i-1][j]>table[i][j-1])
table[i][j] = table[i-1][j];
else table[i][j] = table[i][j-1];
}
}
}
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
if(max<table[i][j])
max = table[i][j];
}
return max;
}

int main()
{
char s1[10000];
char s2[10000];
while(scanf("%s %s",s1,s2)!=EOF)
{
int n = findthelongest(s1,s2);
printf("%d\n",n);
}
return 0;
}


此题:
public class Solution {
/**
* @param A, B: Two string.
* @return: the length of the longest common substring.
*/
public static int longestCommonSubstring(String A, String B) {

char[] s1 = A.toCharArray();
char[] s2 = B.toCharArray();

int len1 = s1.length;
int len2 = s2.length;
if(len1==0 || len2==0)
return 0;

int[][] table = new int[len1+5][len2+5];

int i,j,k;

for(i=0;i<len2;i++)
table[0][i] = (s1[0]==s2[i]?1:0);
for(i=0;i<len1;i++)
table[i][0] = (s1[i]==s2[0]?1:0);

for(i=1;i<len1;i++)
{
for(j=1;j<len2;j++)
{
if(s1[i]==s2[j])
table[i][j] = table[i-1][j-1]+1;
else table[i][j] = 0;
}
}

int max = table[0][0];
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
{
if(max<table[i][j])
max = table[i][j];
}
return max;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: