1. 程式人生 > 實用技巧 >洛谷P2758 編輯距離

洛谷P2758 編輯距離

題目描述

設A和B是兩個字串。我們要用最少的字元操作次數,將字串A轉換為字串B。這裡所說的字元操作共有三種:

1、刪除一個字元;

2、插入一個字元;

3、將一個字元改為另一個字元;

!皆為小寫字母!

輸入格式

第一行為字串A;第二行為字串B;字串A和B的長度均小於2000。

輸出格式

只有一個正整數,為最少字元操作次數。

輸入輸出樣例

輸入

sfdqxbw
gfdgw

輸出

4

AC程式碼

#include <bits/stdc++.h>

using namespace std;
int edit[2002][2002] = {};

int min3(int a, int b, int c) {
    return min(min(a, b), c);
}

int Levenshtein_Distance(string a, string b) {
    int lenA = a.length(), lenB = b.length();
    for (int i = 1; i <= lenA; i++) {
        edit[i][0] = i;
    }
    for (int j = 1; j <= lenB; j++) {
        edit[0][j] = j;
    }
    for (int i = 1; i <= lenA; i++) {
        for (int j = 1; j <= lenB; j++) {
            edit[i][j] = min3(edit[i - 1][j] + 1, edit[i][j - 1] + 1,
                              edit[i - 1][j - 1] + (a[i] != b[j]));
            //刪除,新增,修改三種方法中選擇一個距離最小值
        }
    }
    return edit[lenA][lenB];
}

int main() {
    string a, b;
    cin >> a >> b;
    a = "a" + a;
    b = "a" + b;
    cout << Levenshtein_Distance(a, b);
}

思想

動態規劃。詳見 這裡