数据结构:LCS最长公共子串 动态规划DP + DFS深度优先遍历
2018-02-24 17:36
260 查看
问题是什么
这道题和上一道题不一样的地方就是寻找最长的子串,而不是子序列,这是一个典型的动态规划DP问题代码如下
string a="qwertyuiopasdfghjkl"; string b="afdstyuio555pasdf7y5i5h8"; int lena=a.length(); int lenb=b.length(); int lcs(int i,int j) { if(i==lena || j==lenb) return 0; if(a[i]==b[j]) { cout<<a[i]; return 1+lcs(i+1,j+1); } else if(i<j) return lcs(i+1,j); else return lcs(i,j+1); } void LCS(string a,string b) { int lena=a.length(); int lenb=b.length(); int **cal=new int*[lena+1]; for(int i=0;i<=lena;i++) cal[i]=new int[lenb+1]; for(int i=0;i<=lena;i++) for(int j=0;j<=lenb;j++) cal[i][j]=0; int max=0; int x,y; for(int i=1;i<=lena;i++) { for(int j=1;j<=lenb;j++) { if (a[i-1]==b[j-1]) cal[i][j]=cal[i-1][j-1]+1; else cal[i][j]=0; if(cal[i][j]>max) { max=cal[i][j]; x=i; y=j; } } } int c=max; char res[1000]; res[c--]='\0'; int i=x-1,j=y-1; while (i>=0 &&j>=0) { if(a[i]==b[j]) { res[c--]=a[i]; i--; j--; } else break; } cout<<max<<endl; cout<<res<<endl; for(int i=0;i<=lena;i++) delete [] cal[i]; delete [] cal; } int main() { LCS(a,b); cout<<endl; cout<<lcs(0,0); system("pause"); }
相关文章推荐
- sdut 1008 最大公共子串(求n个字符串的最长公共子串)lcs
- 最长公共子串(LCS:Longest Common Substring)
- dp最长公共子串LCS
- LCS之最长公共子串
- spoj1811 Longest Common Substring(LCS)最长公共子串
- SPOJ - LCS2 Longest Common Substring II 多个串的最长公共子串
- LCS的java算法---考虑可能有多个相同的最长公共子串
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 最长公共子串(Longest Common Substring, LCS)
- SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)
- LCS问题及拓展:最长公共子序列和最长公共子串
- spoj1811 Longest Common Substring(LCS)最长公共子串
- 20. 最长公共子串(ToDo)[LCS]
- LCS算法找出两个字符串最长公共子串(C#实现)
- 动态规划实例(十三):最长公共子串(LCS)
- 最长公共子串 Longest-Common-Substring(LCS)
- 最长公共子串LCS--之动态规划
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 常考的经典算法--最长公共子序列(LCS)与最长公共子串(DP)
- LCS(最长公共子序列) GST(最长公共子串,广义后缀树)