最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

http://www.cnblogs.com/zhangchaoyang/articles/2012070.html


把一个问题转换为若干个规模更小的子问题,并且都借助于一个二维矩阵来实现计算。

约定:字符串S去掉最后一个字符T后为S',T1和T2分别是S1和S2的最后一个字符。

则dist(S1,S2)是下列4个值的最小者:

1.dist(S1',S2')--当T1==T2

2.1+dist(S1',S2)--当T1!=T2,并且删除S1的最后一个字符T1

3.1+dist(S1,S2')--当T1!=T2,并且在S1后面增加一个字符T2

4.1+dist(S1',S2')--当T1!=T2,并且把S1的最的一个字符T1改成T2

#include
#include
#include
#include
#include
#include

using namespace std;
const int maxn=500;
const int inf=0x3f3f3f3f;
const int chart=26;
typedef unsigned long long ll;

int dp[maxn][maxn];
char s1[500],s2[500];
int main(){
    int m,n;
    while(scanf("%s%s",s1,s2)!=EOF){
        n=strlen(s1);m=strlen(s2);
        memset(dp,0x3f,sizeof(dp));
        for(int i = 0;i<=max(m,n);i++) dp[0][i]=dp[i][0]=i;
        for(int i = 1;i<=n;i++)
            for(int j = 1;j<=m;j++){
                if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1];
                dp[i][j]=min(dp[i][j],min(dp[i-1][j]+1,dp[i][j-1]+1));
                dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);
            }
        printf("%d\n",dp[n][m]);

    }
    return 0;
}

最长公共子串

#include
#include
#include
#include
#include
#include

using namespace std;
const int maxn=500;
const int inf=0x3f3f3f3f;
const int chart=26;
typedef unsigned long long ll;

int dp[maxn];
char s1[500],s2[500];
int main(){
    int m,n;
    while(scanf("%s%s",s1,s2)!=EOF){
        int ans=0;
        n=strlen(s1);m=strlen(s2);
        memset(dp,0,sizeof(dp));
        for(int i = 1;i<=n;i++)
            for(int j = m;j;j--){
                if(s1[i-1]==s2[j-1]) dp[j]=dp[j-1]+1;
                else dp[j]=0;
                ans=max(ans,dp[j]);
            }
        printf("%d\n",ans);

    }
    return 0;
}


你可能感兴趣的:(字符串匹配,dp)