算法设计与分析--编辑距离问题


编辑距离问题


描述

设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

样例输出

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;
}

猜你喜欢

转载自blog.csdn.net/qq_34851243/article/details/78256355