编辑距离问题
描述
设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。这里所说的字符操作包括
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B 所用的最少字符操作数称为字符串A到B 的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(A,B)。
编程任务:
对于给定的字符串A和字符串B,编程计算其编辑距离d(A,B)。
输入
输入数据的第一行是字符串A,第二行是字符串B。
输出
程序运行结束时,将编辑距离d(A,B)输出。
样例输入
fxpimu
xwrs
xwrs
样例输出
5
问题分析:
求两个字符串的编辑距离,操作包括 删除、插入、修改。分析示例可以发现编辑距离的规律。
看字符串 A 、B 的长度比较
(1)如果length(A) > length(B)
则执行删除操作 M = length(A) - length(B) 次,
计算 B 字符串与 A 字符串 的不同的字符的个数 记为 N;则表明若 A 变为 B,
需要执行 删除操作 M 次和修改操作 N 次。则编辑距离为 d(A,B) = M+N;
(2)
如果length(A) < length(B)
则执行插入操作 M = length(B) - length(A) 次,
计算 B 字符串与 A 字符串 的不同的字符的个数 记为 N;则表明若 A 变为 B,
需要执行 插入操作 M 次和修改操作 N 次。则编辑距离为 d(A,B) = M+N;
(3)
如果length(A) = length(B)
则直接
计算 B 字符串与 A 字符串 的不同的字符的个数 记为 N;则表明若 A 变为 B,
需要执行修改操作 N 次。则编辑距离为 d(A,B) = N;
代码:
#include <iostream>
#include <bits/stdc++.h> //万能头文件
using namespace std;
int main()
{
string a,b;
int len_a,len_b;
int diff; // a 和 b 中不同字符的个数
int editing_distance; // d(a,b) 编辑距离
int m; // m 为 数组 a 和 b 的长度差
cin>> a;
cin>> b;
len_a = a.length();
len_b = b.length();
m =len_a - len_b;
//cout<<len_a;
int Mycount=0; //A,B中不相同的字母的个数;
for(int i=0;i<len_a;i++){
for(int j=0;j<len_b;j++){
if(b[j] == a[i])
Mycount++;
else
continue;
}
}
// cout<< Mycount;
diff = len_b -Mycount; //a 和 b 中不同的字符个数
if(len_a > len_b)
{ editing_distance = diff + m; } //m 位正数
else if(len_a < len_b)
{ editing_distance = diff - m; } //m 为负数
else
editing_distance = diff;
cout << editing_distance;
return 0;
}