最短编辑距离

C++

最短编辑距离

/*
    给定两个字符串 A 和 B,现在要将 A 经过若干操作变为 B,可进行的操作有:
        删除–将字符串 A 中的某个字符删除。
        插入–在字符串 A 的某个位置插入某个字符。
        替换–将字符串 A 中的某个字符替换为另一个字符。
    现在请你求出,将 A 变为 B 至少需要进行多少次操作。

    1 ≤ n, m ≤ 1000

    f[i][j] 表示  A[i] -> B[j] 至少需要的操作次数

    if a[i] != b[j]:
        f[i][j] = min(
            f[i-1][j] + 1,      # delete
            f[i][j-1] + 1,      # insert
            f[i-1][j-1] + 1,    # change
        )
    else:
        f[i][j] = f[i-1][j-1];  # 这个一定是最小的,因为 f[i][j-1] 和 f[i-1][j-1]肯定最多相差一,
                                # 那么 f[i-1][j-1] <= f[i][j-1] + 1, f[i-1][j-1] <= f[i-1][j] + 1 

*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

const int N = 1010;
int n, m;
char a[N], b[N];

int f[N][N];

int solution_one() {
    f[0][0] = 0;
    for (int i = 0; i <= n; i ++ ) {
        f[i][0] = i;
    }
    for (int i = 0; i <= m; i ++ ) {
        f[0][i] = i;
    }

    for (int i = 1; i <= n; i ++ ) {
        for (int j = 1; j <= m; j ++ ) {
            if (a[i] == b[j]) {
                f[i][j] = f[i - 1][j - 1];
            } else {
                f[i][j] = min(
                    min(f[i-1][j], f[i][j-1]),
                    f[i-1][j-1]
                ) + 1;
            }
        }
    }

    return f[n][m];
}

int main()
{
    scanf("%d", &n);
    scanf("%s", a + 1);
    scanf("%d", &m);
    scanf("%s", b + 1);

    int res = solution_one();

    printf("%d", res);

    return 0;
}


posted @ 2022-07-05 19:24  lucky_light  阅读(83)  评论(0编辑  收藏  举报