最短编辑距离
来源:互联网 发布:北京哪里有mac专柜 编辑:程序博客网 时间:2024/05/01 15:53
描述:
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符;(2)插入一个字符;(3)将一个字符改为另一个字符。将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。要求:输入:第1行是字符串A,第2行是字符串B。
输出:字符串A和B的编辑距离d(A,B)
解题思路:首先定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。
显然可以有如下动态规划公式:
- if i == 0 且 j == 0,edit(i, j) = 0
- if i == 0 且 j > 0,edit(i, j) = j
- if i > 0 且j == 0,edit(i, j) = i
- if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。
用一个map二位数组来进行存储,遍历完后 map[s1.length()][s2.length()]存储的数字就是要编辑的最短距离。
#include<iostream>using namespace std;int min(int a,int b){ if(a<b) return a; else return b;}int edit(string s1,string s2){ int i,j,d,temp; int len1=s1.length(); int len2=s2.length(); int map[110][110]; for(i=0;i<len1+1;i++) { map[i][0]=i; } for(i=0;i<len2+1;i++) { map[0][i]=i; } for(i=1;i<len1+1;i++) { for(j=1;j<len2+1;j++) { temp=min(map[i-1][j]+1,map[i][j-1]+1); if(s1[i-1]==s2[j-1]) { d=0; } else d=1; map[i][j]=min(temp,map[i-1][j-1]+d); } } cout<<"********************"<<endl; for(i=0;i<len1+1;i++) { for(j=0;j<len2+1;j++) { cout<<map[i][j]<<" "; } cout<<endl; } cout<<"********************"<<endl; return map[len1][len2];}int main(){ int len1,len2,i,j; string s1,s2; cin>>s1>>s2; int r=edit(s1,s2); cout<<"最短编辑距离为:"<<r<<endl; return 0;}
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离
- 最短编辑距离算法
- HDU3356AGTC(最短编辑距离)
- 最短编辑距离算法
- 最短编辑距离 poj3356
- poj4323 最短编辑距离
- 最短编辑距离2
- 0.附录
- 1013
- 关于文件目录线程级深度优先搜索效率的研究
- Dijkstra算法(单源最短路问题)
- Web前端性能优化(九)图像和Cookie优化
- 最短编辑距离
- 用到MNIST数据集的实验(总结中……)
- 【LeetCode】 17. Letter Combinations of a Phone Number
- 学生信息系统之优化(一)之ascii码
- Codeforces 665C Simple Strings【暴力,贪心】
- linux命令
- 处理TAP国际漫游话单的几种类库使用方法
- 关于conversation generation的论文笔记
- 1.认识Makefile文件