56.最长公共字串。
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符
串一称之为字符串二的子串。
注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。
例如:输入两个字符串 BDCABA 和 ABCBDAB,字符串 BCBA 和 BDAB 都是是它们的最
长公共子串,则输出它们的长度 4,并打印任意一个子串。
分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规
划题,因此一些重视算法的公司像 MicroStrategy 都把它当作面试题。
/* 56.最长公共字串。 题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中, 则字符串一称之为字符串二的子串。 注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。 请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 例如:输入两个字符串 BDCABA 和 ABCBDAB,字符串 BCBA和BDAB 都是是它们的最 长公共子串,则输出它们的长度4,并打印任意一个子串。 分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规 划题,因此一些重视算法的公司像 MicroStrategy都把它当作面试题。 DP题算法导论上有: c[i,j]=0 i=0||j=0 =c[i-1,j-1]+1 a[i]==a[j] =max(c[i-1,j],c[i,j-1]) a[i]1=a[j] */ #include<iostream> #include<stdio.h> #include<cmath> #include<algorithm> using namespace std; int dp[100][100]; int LCS(char *p1, char *p2) { int l1=strlen(p1),l2=strlen(p2),i,j,k; char str[100]; for (i=0;i<l1;i++) dp[i][0]=0; for(j=0;j<l2;j++) dp[0][j]=0; for (i=0;i<l1;i++) for(j=0;j<l2;j++) { if(p1[i]==p2[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1]; } //输出 k=0; for (i=l1-1;i>=0;) for(j=l2-1;j>=0;) if(p1[i]==p2[j]) { str[k++]=p1[i]; i--; j--; } else { if(dp[i][j-1]>=dp[i-1][j]) j--; else i--; } for (i=k-1;i>=0;i--) printf("%c",str[i]); printf("\n"); return dp[l1-1][l2-1]; } void print() { } int main() { char a[]={"BDCABA"}; char b[]={"ABCBDAB"}; char c[]={} printf("%s和%s的最长公共子串是:\n",a,b); printf("长度为:%d\n",LCS(a,b)); return 0; }