中等 最长公共子串
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;
}
}