題意:
編輯距離問題就是給兩個字串;
如: 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兩個字串,輸出代價 刪除 可以看做...