題目描述
給定兩個字串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 ...