LCS
关于最大公共子序列,自己写了个程序
程序只要输入两个字符串就ok了
一直不明白:最长公共子串和最长公共子序列的区别。
上网查了下,最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续
1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 using namespace std; 5 char a[2005]; 6 char b[2005]; 7 int dp[2005][2005]; 8 int max(int a,int b) 9 { 10 return a>b?a:b; 11 } 12 int main() 13 { 14 int Case; 15 int i,j; 16 while(1) 17 { 18 memset(dp,0,sizeof(dp)); 19 scanf("%s",&a[1]); 20 scanf("%s",&b[1]);//注意这里从1开始 21 for(i=1;a[i]!='\0';i++)//注意这里不可以用strlen,因为字符串从第一个开始存,而不是第0个 22 { 23 for(j=1;b[j]!='\0';j++) 24 { 25 if(a[i]==b[j]) 26 { 27 dp[i][j]=dp[i-1][j-1]+1; 28 } 29 else 30 { 31 dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 32 } 33 } 34 } 35 printf("%d\n",dp[--i][--j]); 36 } 37 38 return 0; 39 }
嗯,但是这个不能求最大公共字串。