第九章 動態規劃-1276:【例9.20】編輯距離

1276:【例9.20】編輯距離

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 4302 通過數: 1761
【題目描述】
設A和B是兩個字符串。我們要用最少的字符操作次數,將字符串A轉換爲字符串B。這裏所說的字符操作共有三種:

1、刪除一個字符;

2、插入一個字符;

3、將一個字符改爲另一個字符。

對任意的兩個字符串A和B,計算出將字符串A變換爲字符串B所用的最少字符操作次數。

【輸入】
第一行爲字符串A;第二行爲字符串B;字符串A和B的長度均小於2000。

【輸出】
只有一個正整數,爲最少字符操作次數。

【輸入樣例】
sfdqxbw
gfdgw
【輸出樣例】
4


思路:
刪除A[i] <=>在B[i]前 插入
在A[i]前插入與B[i]相同的元素 <=> 刪除 B[i]
修改A[i] <=> 修改B[i]
這樣的兩種操作,都增加了一次操作次數,最終同樣的結果
所以,我們只需要對一個串操作,最終的結果沒有影響
只對B操作
f[i][j]表示要使A的前i個元素與B的前j個元素相同的最少操作次數
初始化
f[i][0] = i;
f[0][j] = j;

轉移方程:
如果A[i]==B[i],不做修改,f[i][j] = f[i - 1][j - 1]
否則,三種修改方式,在B中加一個,f[i][j] = f[i - 1][j] + 1;
在B中刪一個,f[i][j] = f[i][j - 1] + 1;
在B中改一個,f[i][j] = f[i - 1][j - 1] + 1;
三者取maxx


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define N 3000
int f[N][N];
int lena, lenb;
char a[N], b[N];
int main() {
    scanf("%s", a);
    getchar();
    scanf("%s", b);
    lena = strlen(a);
    lenb = strlen(b);
    for(int i = 1; i <= lena; i++) f[i][0] = i;
    for(int i = 1; i <= lenb; i++) f[0][i] = i; 
    for(int i = 1; i <= lena; i++) {
        for(int j = 1; j <= lenb; j++) {
            if(a[i-1] == b[j-1]) {
                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;
        }
    }
    printf("%d\n", f[lena][lenb]);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章