编辑距离问题(edit.pas/c/cpp)
2017-09-16 21:02
232 查看
编辑距离问题(edit.pas/c/cpp)
【问题描述】设 A 和 B 是两个字符串。要用最少的字符操作将字符串 A 变成字符串 B。这里所说的
字符操作包括:
( 1)删除一个字符。
( 2)插入一个字符。
( 3)将一个字符改为另一个字符。
将字符串 A 变成字符串 B 的最少字符操作数称为字符串 A 到 B 的编辑距离,记为 d (A,B)。
试编写程序,对任意给定的 2 个字符串 A 和 B,计算出他们的编辑距离 d (A,B)。
【输入文件】
输入文件只有两行,分别是字符串 A 和字符串 B。
【输出文件】
输出文件只有一行,即编辑距离 d (A,B)。
【文件样例】
edit.in edit.out
fxpimu 5
xwrs
【数据规模】
40%的数据字符串 A, B 长度均不超过 100;
100%的数据字符串 A, B 长度均不超过 4000。
【思路】
这是一个二维动态规划,针对这个样例我们制一个表来理解一下。
0 f x p i m u
0 0 1 2 3 4 5 6
x 1 1 1 2 3 4 5
w 2 2 2 2 3 4 5
r 3 3 3 3 3 4 5
s 4 4 4 4 4 4 5
解释一下,如果是从上面或者左边转移过来的话,就意味着字符串a需要增长或者缩短长度了,需要花费1个距离。如果从左上角转移过来的话,如果两字符串对应的两个位置的元素相同的话,就直接转移就行,反之就花费1个距离。
这样的话就输出右下角元素的大小即可。
代码
#include<iostream> #include<cstring> #include<cmath> using namespace std; int n,m,i,j; string s,t; int f[4001][4001]; char a[4001],b[4001]; int r() { int ans=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { // if(ch=='-') // f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { ans*=10; ans+=ch-'0'; ch=getchar(); } return ans*f; } int minn(int x,int y,int z) { if(x>=y&&z>=y) return y; if(y>=x&&z>=x) return x; if(y>=z&&x>=z) return z; } int main() { freopen("edit.in","r",stdin); freopen("edit.out","w",stdout); cin>>s>>t; int l1=s.size(),l2=t.size(); for(int i=0;i<l1;i++) a[i+1]=s[i]; for(int i=0;i<l2;i++) b[i+1]=t[i]; for(int i=1;i<=l1;i++) f[0][i]=f[0][i-1]+1; for(int i=1;i<=l2;i++) f[i][0]=f[i-1][0]+1; for(int i=1;i<=l2;i++) for(int j=1;j<=l1;j++) { f[i][j]=min(f[i-1][j],f[i][j-1])+1; if(a[j]==b[i]) f[i][j]=min(f[i-1][j-1],f[i][j]); else f[i][j]=min(f[i-1][j-1]+1,f[i][j]); } cout<<f[l2][l1]; return 0; } /* fxpimu xwrs abcfe adev */
相关文章推荐
- 动态规划:编辑距离问题
- 动态规划-编辑距离问题
- 动态规划求解编辑距离问题
- 【dp】编辑距离问题
- android中控制EditText不可编辑的问题
- 最小编辑距离问题
- 编辑距离问题
- 最小编辑距离问题(Edition Distance)
- 街道问题(way.pas/c/cpp)
- 动态规划之最大k乘积,编辑距离,k好数,节点选择,背包问题
- 编辑距离问题
- 51nod 编辑距离问题 dp
- 动态规划之最小编辑距离问题
- 编辑距离问题
- edit distance 编辑距离
- 关于获取EditText编辑框中的值为空的问题
- 解决EditText多行编辑时在ScrollView中无法滚动的问题
- 51nod动态规划入门--编辑距离问题
- DP5 编辑距离 Edit Distance @geeksforgeeks
- [dp]编辑距离问题