最长公共子串与最长公共子序列是有区别的。区别在于最长公共子串要求字符是连续的。
例如:str1: abcd str2: abec
那么最长公共子序列是:abc,长度为3
最长公共子串是:ab,长度为2
1. 最长公共子序列
Largest common subsequence 最长公共子序列:用f[i][j]表示str1的前i个字符与str2的前j个字符的最长公共子序列的长度。
int LCS(int a[],int b[],int len) { vector<int> f(len+1,0); for(int i=1;i<=len;i++) for(int j=1;j<=len;j++) { f[j]=a[i-1]==b[j-1]?f[j-1]+1:max(f[j],f[j-1]); } return f[len]; }
2. 最长公共子串
Largest common substring 最长公共子串:用f[i][j]表示str1的包含第i个字符的前i个字符 与 str2的包含第j个字符的前j个字符的 最长公共连续子序列。
当a[i]==b[j]时,f[i][j]=f[i-1][j-1]+1
当a[i]!=b[j]时,f[i][j]=0
int lcs(string a,string b) { int m=a.size(); int n=b.size(); if(m==0||n==0) return 0; int max_len=-1; vector<vector<int>> f(m+1,vector<int>(n+1)); for(int i=0;i<=m;i++) f[i][0]=0; for(int j=0;j<=n;j++) f[0][j]=0; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1; else f[i][j]=0; max_len=max(max_len,f[i][j]); } return max_len; }