行編輯距離Edit Distance——動態規劃
阿新 • • 發佈:2017-05-13
add 最小 base 編輯 cpp style 進行 sel 等於
將s中加入t[j],dp[i][j] = dp[i][j-1] +1;
將s和t進行替換,dp[i][j] = dp[i-1][j-1] +1。
因此,能夠寫出狀態轉移方程: dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1] + (s[i]==t[j] ? 0 :1)) 分別相應:刪除、加入、替換(若相等就不替換)
代碼:
題目描寫敘述:
給定一個源串和目標串。可以對源串進行例如以下操作:
1. 在給定位置上插入一個字符
2. 替換隨意字符
3. 刪除隨意字符
寫一個程序。返回最小操作數,使得對源串進行這些操作後等於目標串,源串和目標串的長度都小於2000。
思路:
設狀態dp[i][j] 表示從源串s[0...i] 和 目標串t[0...j] 的最短編輯距離
邊界為:dp[i][0] = i,dp[0][j] = j
遞推方程:
- 假設s[i] == t[j], 那麽 dp[i][j] = dp[i-1][j-1]
- 假設s[i] != t[j],那麽有三種操作情況:
因此,能夠寫出狀態轉移方程: dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1] + (s[i]==t[j] ? 0 :1)) 分別相應:刪除、加入、替換(若相等就不替換)
代碼:
class Solution { public: int minDistance(string word1, string word2) { int Slen = word1.size(); int Tlen = word2.size(); int dp[Slen+1][Tlen+1] = {0};//註意:這裏都+1,而且初始化為0 //長度為n的字符串有n+1個隔板 for(int i=1; i<=Slen; i++) //註意從1開始 dp[i][0] = i; for(int j=1; j<=Tlen; j++) dp[0][j] = j; for(int i=1; i<=Slen; i++) { for(int j=1; j<=Tlen; j++) { if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1]; else { int temp = min(dp[i-1][j], dp[i][j-1]); dp[i][j] = min(temp, dp[i-1][j-1]) + 1; } } } return dp[Slen][Tlen]; } };
行編輯距離Edit Distance——動態規劃