- 問題描述
Levenshtein 距離,又稱編輯距離,指的是兩個字符串之間,由一個轉換成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。編輯距離的算法是首先由俄國科學家Levenshtein提出的,故又叫Levenshtein Distance。
Ex:
字符串A:abcdefg
字符串B: abcdef
通過增加或是刪掉字符”g”的方式達到目的。這兩種方案都需要一次操作。把這個操作所需要的次數定義爲兩個字符串的距離。
要求:
給定任意兩個字符串,寫出一個算法計算它們的編輯距離。
- 解題思路
問題抽象:將A變爲B所需的最少操作步數(也可以是B變爲A的最少操作步數,兩個角度一樣。因爲A變爲B如果有插入的畫,對應B變爲A就可以等價爲刪除;A變爲B爲替換的話,B變爲A也可等價位替換;A變爲B爲刪除的話,B變爲A等價爲插入,因爲步數都一樣)。用dp[x][y]表示A的前x個字符轉換爲B的前y個字符所需要的最少操作步數
最優子結構:A的前x個字符變爲B的前y個字符所需要的最少操作步數d[x][y]取決於子問題:
1)A的最後一位參與變換:
if(A的第x個字符不等於B的第y個字符)dp[x][y]=dp[x-1][y-1]+1 //將A的前x-1個字符變爲B的前y-1個字符,然後將最後一個字符替換成B的最後一個字符(一步)
else dp[x][y]=dp[x-1][y-1] //如果A的最後一個字符等於B的最後一個字符,則A的前x個字符變爲B的前y個字符等價於將A的前x-1個字符變爲B的前y-1個字符
2)A的最後一位不參與變換(刪除掉A的最後一位)
dp[x][y]=dp[x-1][y]+1 //將A的前x-1個字符變爲B,然後將最後一個字符刪除
3)B的最後一位不參與變化(刪除掉B的最後一位)
dp[x][y]=dp[x][y-1]+1 //將B的前y-1個字符變爲A,然後將最後一個字符刪除
dp[x][y]=min{dp[x-1][y-1]+1或dp[x-1][y-1],dp[x-1][y]+1,dp[x][y-1]+1}
當x=0時,即A爲空字符串,則A變爲B的前Y個字符所需的操作爲y,dp[0][y]=y
同理,y=0時,dp[x][0]=x
這樣自底向上就能求出將A變爲B最少的操作步數dp[a.length][b.length].
**動態規劃的關鍵一步就是如何就將問題與子問題聯繫起來,即將問題i想辦法用問題i-1表示**