动态规划解决 最长公共子序列 与 最长公共字串问题

一、最长公共子序列

动态规划解决 最长公共子序列 与 最长公共字串问题_第1张图片

#include
#include
#include
#include
using namespace std;
string solve(string s1,string s2){
    s1="*"+s1;
    s2="&"+s2;
    int n1=s1.size(),n2=s2.size();
    int dp[n1+1][n2+1];
    memset(dp,0,sizeof(dp));
    string ans="";
    for(int i=1;i=0&&n2>=0){
        if(s1[n1]==s2[n2]){
            ans+=s1[n1];
            n1--;
            n2--;
        }
        else if(dp[n1-1][n2]>dp[n1][n2-1])
            n1-=1;
        else
            n2-=1;
    }
    reverse(ans.begin(),ans.end());
    return ans;
}
int main()
{
    string s1="12345EF",s2="1AB2345CD";
    cout<

最后dp[n1-1][n2-1]就是最长公共子序列的长度 

二:最长公共子串

动态规划解决 最长公共子序列 与 最长公共字串问题_第2张图片

最后maxx就是最长公共子串的长度,求出最长公共字串的长度之后,关键是怎么返回去找到任意一个最长的子串,可以遍历找到dp数组的最大值,一直往左上角走就是答案。

#include
#include
#include
#include
using namespace std;
string solve(string s1,string s2){
    s1="*"+s1;
    s2="&"+s2;
    int n1=s1.size(),n2=s2.size();
    int dp[n1+1][n2+1];
    memset(dp,0,sizeof(dp));
    string ans="";
    int maxx=-1,p=0,q=0;
    for(int i=1;i=maxx){
                maxx=dp[i][j];
                p=i;
                q=j;
            }
        }
    }
   // cout<=0&&q>=0){
        if(s1[p]==s2[q]){
            ans+=s1[p];
            p--;
            q--;
        }
        else
            break;
    }
    reverse(ans.begin(),ans.end());
    return ans;
}
int main()
{
    string s1="12345EF",s2="1AB2345CD";
    cout<

最长公共子串就是最近遇到的一个面试题。

你可能感兴趣的:(字符串,ACM程序设计基础,dp)