题目:
给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa]。二者的最长公共子串为[aba],长度为3。
子序列是不要求连续的,字串必须是连续的。
思路:
1、简单思想:
遍历两个字符串X、Y,分别比较X的字串与Y的字串,求出最长的公共字串。
#include <iostream> #include <vector> using namespace std; int getComLen(char *str1,char *str2){ int len=0; while(*str1 && *str2){ if(*(str1++)==*(str2++)) len++; } return len; } int LCS1(char *str1,int len1,char *str2,int len2){ int maxlen=0; int maxIndex=0; int len; for(int i=0;i<len1;i++){ for(int j=0;j<len2;j++){ len=getComLen(str1+i,str2+j); if(len>maxlen){ maxlen=len; maxIndex=i; } } } cout<<"Length of Longest Common Substring: "<<maxlen<<endl; cout<<"Index of LCS is: "; for(int i=maxIndex;i<maxIndex+maxlen;i++) cout<<str1[i]; cout<<endl; return maxlen; } // dynamic programming int LCS2(char *str1,int len1,char *str2,int len2){ vector<vector<int> > dp(len1+1,vector<int>(len2+1,0)); int maxlen=0; int maxIndex; for(int i=0;i<=len1;i++){ for(int j=0;j<=len2;j++){ if(i==0 || j==0) dp[i][j]=0; else{ if(str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1; } if(dp[i][j]>maxlen){ maxlen=dp[i][j]; maxIndex=i-maxlen+1; } } } cout<<"Length of Longest Common Substring: "<<maxlen<<endl; cout<<"Index of LCS is: "; for(int i=maxIndex-1;i<maxIndex-1+maxlen;i++) cout<<str1[i]; cout<<endl; return maxlen; } int main() { char str1[]="Chinese"; char str2[]="Chienglish"; int len1=sizeof(str1)/sizeof(str1[0])-1; int len2=sizeof(str2)/sizeof(str2[0])-1; cout << LCS1(str1,len1,str2,len2) << endl; return 0; }
时间: 2024-10-13 12:13:17