标签:
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<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstring>
#include<queue>
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<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstring>
#include<queue>
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;
}
最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
标签:
原文地址:http://blog.csdn.net/gg_gogoing/article/details/45285747