跳转至

一本通-1298:计算字符串距离(动态规划-编辑距离)

【题目描述】 对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:

1
2
3
修改一个字符(如把“a”替换为“b”);

删除一个字符(如把“traveling”变为“travelng”)。

比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。

给定任意两个字符串,写出一个算法来计算出他们的距离。

【输入】 第一行有一个整数n。表示测试数据的组数。

接下来共n行,每行两个字符串,用空格隔开,表示要计算距离的两个字符串。

字符串长度不超过1000。

【输出】 针对每一组测试数据输出一个整数,值为两个字符串的距离。

【输入样例】 3 abcdefg abcdef ab ab mnklj jlknm

【输出样例】 1 0 4


#include <bits/stdc++.h>

using namespace std;

string s1, s2;
vector<vector<int> > d(1005, vector<int>(1005));
int m, n;

int EditDistance()
{
    m = s1.size(); n = s2.size();
    for (int i = 1; i <= m; ++i) d[i][0] = i;
    for (int i = 1; i <= n; ++i) d[0][i] = i;

    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (s1[i - 1] != s2[j - 1]) {
                d[i][j] = min(d[i - 1][j], min(d[i][j - 1], d[i - 1][j - 1])) + 1;
            }
            else d[i][j] = d[i - 1][j - 1];
        }
    }

    return d[m][n];
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int caseNum; cin >> caseNum;
    while (caseNum--) {
        cin >> s1 >> s2;
        cout << EditDistance() << endl;
    }

    return 0;
}