編輯距離問題 教學篇

2022-05-03 21:57:06 字數 1790 閱讀 7236

編輯距離,又稱levenshtein距離(也叫做edit distance),是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。

例如將kitten一字轉成sitting:

sitten (k->s)

sittin (e->i)

sitting (->g)

所以kitten和sitting的編輯距離是3。俄羅斯科學家vladimir levenshtein在2023年提出這個概念。

給出兩個字串a,b,求a和b的編輯距離。

這題要分三種情況考慮:

先設dp[i][j]為a中1~i的子串和b中1~j的子串的編輯距離。

第一種情況,(由常識可得)a中1~i的子串可以由a中1~i-1的子串加上a[i]得到,b中1~j的子串可以由b中1~j-1的子串加上b[j]得到。如果我們知道了dp[i-1][j-1]=k,且a[i] != b[j],那麼dp[i][j]就可以是k+1,即在原基礎上修改a[i]變成b[j],多花費了1。如果a[i]== b[j],那dp[i][j]還是k。

第二種情況,如果我們知道了dp[i-1][j]=k,那麼我們可以考慮把a[i]刪除掉,這樣dp[i][j]就可以是k+1。

第三種情況,如果我們知道了dp[i][j-1]=k,那麼我們可以考慮把b[j]新增到a[i]後面,這樣dp[i][j]就可以是k+1。

綜上,dp[i][j]取上述三種情況的最小值。

另外,這題可以做個小優化,由於dp[i][j]只和dp[i-1][j],dp[i][j-1],dp[i-1][j-1]有關,可以把dp陣列改成滾動陣列dp[2][maxn],這樣可以有效降低空間複雜度

**測試處:

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define x first

#define y second

#define clr(u,v); memset(u,v,sizeof(u));

#define in() freopen("data","r",stdin);

#define out() freopen("ans","w",stdout);

#define clear(q); while (!q.empty()) q.pop();

#define pb push_back

using

namespace

std;

typedef

long

long

ll;typedef pair

pii;

const

int maxn = 1e3 + 10

;const

int inf = 0x3f3f3f3f

;char

str1[maxn], str2[maxn];

int dp[maxn][maxn];//

dp[i][j]代表str1中1~i的子串變成str2中1~j的子串的最小花費

intmain()

//for (int i = 0; i <= len1; i++)

// printf("

%d\n

", dp[len1][len2]);

return0;

}

編輯距離問題

問題描述 設a和b是2個字串。要用最少的字元操作將字元a轉化為字元b。字元操作包括 1 刪除乙個人字元。2 插入乙個字元。3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 設計乙個演算法,對給定的任意兩個字串a和b計算出他們的編輯距離d...

編輯距離問題

編輯距離問題 給定兩個字串s和t,對於t我們允許三種操作 1 在任意位置新增任意字元 2 刪除存在的任意字元 3 修改任意字元 問最少操作多少次可以把字串t變成s?例如 s abcf t dbfg 那麼我們可以 1 把d改為a 2 刪掉g 3 加入c 所以答案是3。輸入 第1行 字串a a的長度 1...

編輯距離問題

給定兩個字串s和t,對於t我們允許三種操作 1 在任意位置新增任意字元 2 刪除存在的任意字元 3 修改任意字元 問最少操作多少次可以把字串t變成s?例如 s abcf t dbfg 那麼我們可以 1 把d改為a 2 刪掉g 3 加入c 所以答案是3。輸入 第1行 字串a a的長度 1000 第2行...