题目:
输入字符串中对称的子字符串的最大长度。比如输入字符串“roorle”,由于该字符串里最长的对称子字符串是“roor”,因此输出4.
思路:
1、求字符串”roorle“和反序”elroor“的最长公共子串
2、最长回文子串
代码:
1、最长公共子串
#include<iostream> using namespace std; // naive method // O(n^3) int comlen(const string &str1,int i,int m,const string &str2,int j,int n){ int len=0; while(i<m && j<n && str1[i++]==str2[j++]) len++; return len; } int LongestCommonSubString(const string &str1,const string &str2){ int m=str1.size(); int n=str2.size(); int maxLen=0; int maxIndex=-1; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ int len=comlen(str1,i,m,str2,j,n); if(len>maxLen){ maxLen=len; maxIndex=i; } } } for(int i=0;i<maxLen;i++){ cout<< str1[maxIndex+i] <<" "; } cout<<endl; return maxLen; } // DP method // O(n^2) int LongestCommonSubString_1(const string &str1,const string &str2){ int m=str1.size(); int n=str2.size(); int dp[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++) dp[i][j]=0; } int maxLen=0; int maxIndex; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(str1[i]==str2[j]){ if(i>0 && j>0) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=1; } if(dp[i][j]>maxLen){ maxLen=dp[i][j]; maxIndex=i-maxLen+1; } } } for(int i=0;i<maxLen;i++) cout<<str1[maxIndex+i]<<" "; cout<<endl; return maxLen; } // DP method // O(n^2) int LongestCommonSubString_2(const string &str1,const string &str2){ int m=str1.size(); int n=str2.size(); int dp[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++) dp[i][j]=0; } int maxLen=0; int maxIndex; for(int i=m-1;i>=0;i--){ for(int j=n-1;j>=0;j--){ if(str1[i]==str2[j]){ if(i<m-1 && j<n-1) dp[i][j]=dp[i+1][j+1]+1; else dp[i][j]=1; } if(dp[i][j]>maxLen){ maxLen=dp[i][j]; maxIndex=i; } } } for(int i=0;i<maxLen;i++) cout<<str1[maxIndex+i]<<" "; cout<<endl; return maxLen; } // DP method // O(n^2) int LongestCommonSubString_3(const string &str1,const string &str2){ int m=str1.size(); int n=str2.size(); int dp[m+1][n+1]; for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++) dp[i][j]=0; } int maxLen=0; int maxIndex; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(str1[i]==str1[j]) dp[i][j]=dp[i-1][j-1]+1; if(dp[i][j]>maxLen){ maxLen=dp[i][j]; maxIndex=i-maxLen+1; } } } for(int i=0;i<maxLen;i++) cout<<str1[maxIndex+i]<<" "; cout<<endl; return maxLen; } int main(){ string str1="abcdefg"; string str2="bgfcdft"; cout<<LongestCommonSubString(str1,str2)<<endl; cout<<LongestCommonSubString_1(str1,str2)<<endl; cout<<LongestCommonSubString_2(str1,str2)<<endl; cout<<LongestCommonSubString_3(str1,str2)<<endl; return 0; }