dp 編輯距離問題

2021-07-11 19:16:39 字數 1601 閱讀 3238

題意:

編輯距離問題就是給兩個字串;

如: abcdef

abbefc

通過增、刪、改三種方式使第二個字串變成第乙個字串;

顯然此樣例為 3 次改動;

題目求給定的字串以後最少的改動次數;

理解:一看這題其實已經蒙了;

當然有一種方法可以做,就是廣搜;

但廣搜在時間上是解決不了問題的;

所以得另謀出路;

正真的具體的解題思路如下:

首先:

我們向兩個字串新增一些下劃線;

則: abcdef_

ab_befc

可看出:

通過增刪改很明顯可以轉化過去;

那麼什麼情況增、什麼情況改、什麼情況刪呢?

我們現設乙個需要改動的最小值 f(i, j);

表示在第乙個字串的 i 與第二個字串的 j 字元之間存在的最小改動;

我們知道如果 str1[i] == str2[j] 的話;

則:f(i, j) = f(i - 1, j - 1);

如果不等的話;

則:f(i, j) = f(i - 1, j - 1) + 1;

這就是改;

而在前 i 個字元與前 j - 1 個字元相同了,那麼就要刪;

如: abab

ababc

則:f(i, j) = f(i, j - 1) + 1;

而在前 i - 1 個字元於前 j 個字元相同了,那麼就要添;

ababa

abab

則:f(i, j) = f(i - 1, j) + 1;

最後兩個難以理解,但是是不可缺的;

這樣,我們就可以通過上述三個式子求出乙個最小值;

答案就是最小值了;

**如下:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

const

double min_inf = 1e-7;

const

int max_inf = (1e9) + 7;

#define x first

#define y second

int main()

for (int i = 1; i <= len2; ++i)

for (int i = 1; i <= len1; ++i)

else }}

cout

<< dp[len1][len2] << endl;

return

0;}

編輯距離 (dp)

編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sit...

DP 編輯距離

2019 02 27 題目及 更新 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。對任意的兩個字串a和b,計算出將字串a變換為字串b所用的最少字元操作次數。第一行為字串a 第二行為字...

編輯距離 DP

設a aa和b bb是兩個字串。我們要用最少的代價 或者字元操作次數 將字串a aa轉換為字串b bb。字元操作有三種 1.插入乙個字元,所需代價為x xx2.刪除乙個字元,所需代價為y yy3.將乙個字元改為另乙個字元,即替換,所需代價為z zz輸入abab ab兩個字串,輸出代價 刪除 可以看做...