题目:

输入字符串中对称的子字符串的最大长度。比如输入字符串“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;        
}
View Code

相关文章: