編輯距離,又稱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行...