最长公共子序列

来源:互联网 发布:三端口环行器 编辑:程序博客网 时间:2024/06/07 22:30

最长公共子序列问题是经典的动态规划问题:给定两个字符串str1和str2,返回两个字符串的最长公共子序列(不一定要连续)。

举例: str1="a1b2c3d4" str2="a2b3c4e" 它们的最长公共子串是"abc"

下面是c++代码实现

#include<iostream>#include<string>#include<vector>using namespace std;int main(){    string str1,str2;    cin>>str1>>str2;    int i,j;    int **dp;    *dp = new int[str1.size()];    for(int i=0;i<str1.size();i++){        dp[i] = new int[str2.size()];    }    dp[0][0] = str1[0] ==str2[0] ?1:0;    for(i =1;i<str1.size();i++){        dp[i][0] = max(dp[i-1][0],str1[i]==str2[0]?1:0);    }    for(i=1;i<str2.size();i++){        dp[0][i] = max(dp[0][i-1],str1[0]==str2[i]?1:0);    }    for(i =1;i<str1.size();i++){        for(j =1;j<str2.size();j++){            dp[i][j] = max(dp[i-1][j],dp[i][j-1]);            if(str1[i]==str2[j]) dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1);        }    }    int maxlen = dp[str1.size()-1][str2.size()-1];    char *result = new char[maxlen];    int k = maxlen-1;    i = str1.size()-1;    j = str2.size()-1;    while(k>=0){        if(i>0 && dp[i][j] ==dp[i-1][j]){            i--;        }else if(j>0 && dp[i][j] ==dp[i][j-1]){            j--;        }else{            result[k--] = str1[i];            i--;            j--;        }    }    cout<<result<<endl;    return 0;}


0 0