動態規劃之字串最短編輯距離

2021-10-06 21:39:38 字數 1769 閱讀 8207

題目描述

給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有:

刪除–將字串a中的某個字元刪除。

插入–在字串a的某個位置插入某個字元。

替換–將字串a中的某個字元替換為另乙個字元。

現在請你求出,將a變為b至少需要進行多少次操作。

輸入格式
第一行包含整數n,表示字串a的長度。

第二行包含乙個長度為n的字串a。

第三行包含整數m,表示字串b的長度。

第四行包含乙個長度為m的字串b。

字串中均只包含小寫字母。

輸出格式
輸出乙個整數,表示最少操作次數。

資料範圍
1≤n,m≤1000

輸入樣例:
10

agtctgacgc

11agtaagtaggc

輸出樣例:
題解:

將乙個字串通過刪除、插入、替換變為另乙個字串的最短距離,可以用動態規劃來做,用f(i, j)來表示長度為i的字串變為長度為j的字串最小的操作次數,那麼如何來求f(i, j)呢?對每個字元我們有3種操作:

1.刪除:假設刪除a[i]後,a[1 ~ i] 與 b[1 ~ j] 匹配,那麼說明a[1 ~ i - 1]已經與b[1 ~ j]相等了,那麼多出來的a[i]直接刪掉即可,狀態轉移方程為:f(i, j) = f(i - 1, j) + 1

2.插入: 假設插入乙個a[i],使a[i] == b[j]後,a[1 ~ i] 與 b[1 ~ j] 匹配,那麼說明a[1 ~ i]已經與b[i ~ j - 1]相等了,要使a[1 ~ i]與b[i ~ j]相等,只需再a[1 ~ i]的後面新增乙個b[j]即可

狀態轉移方程為:f(i, j) = f(i, j - 1) + 1

3.替換:假設將a[i]替換成b[j],使得a[1 ~ i] 與 b[1 ~ j] 匹配,那麼說明a[1 ~ i - 1]已經與b[i ~ j - 1]相等了,要使a[1 ~ i]與b[i ~ j]相等,只需將a[i]替換為b[j]即可。

如果a[i] = b[j],則無需替換,狀態轉移方程為:f(i, j) = f(i - 1, j - 1)

如果a[i] != b[j],則需要替換,狀態轉移方程為:f(i, j) = f(i - 1, j - 1) + 1

所以我們得出來總的狀態轉移方程式為就是上述方程式的最小值

**如下:

#include

using namespace std;

const

int n =

1010

;char s1[n]

, s2[n]

;int f[n]

[n];

intmain()

} cout << f[n]

[m]<< endl;

return0;

}

動態規劃 計算字串編輯距離

題目 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 試設計乙個有效演算法,對任給的2 個字串a和b,計...

動態規劃 之字串編輯距離 難度 2星

include 對於序列s和 t,它們之間距離定義為 對二者其一進行幾次以下的操作 1 刪去乙個字元 2 插入乙個字元 3 改變乙個字元。每進行一次操作,計數增加1。將s和 t變為同乙個字串的最小計數即為它們的距離。給出相應演算法。define min x,y x define inf 50000 ...

動態規劃學習 最短編輯距離

傳送門 有需要可以支援一下yxc大佬的課程 題意 對a串進行增刪改操作變成b串 思路 閆式dp nb!狀態定義類似於lcs dp i j 表示a 1 i 匹配b 1 j 的運算元 屬性 最小值 對於增操作,對於ai後需要增加乙個字母匹配bj,那麼即需要增加的值肯定為bj,此時上乙個狀態就是dp i ...