1. 程式人生 > >leetcode 72. Edit Distance

leetcode 72. Edit Distance

沒有 require targe 了吧 length rip follow des steps

link

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

題意: 定義一次編輯可以1.插入一個字符 2. 刪除一個字符 3 將一個字符替換為另一個。

求兩個字符串的最短編輯距離。

思路:

在切了前面兩道匹配之後,這題應該就很容易了吧。

同樣定義dp[i][j]為word1[0,i) 匹配word2[0,j)的最小編輯距離。

在轉移時,首先我們能看到插入一個字符和刪除一個字符是一回事,刪除一個字符能完成的插入一個字符也一定能完成,因此可以無視刪除操作。(這很重要,這決定了狀態只能從前面轉移過來)

因此dp[i][j]可以由4個地方轉移而來:

1. word1[i-1] == word2[j-1]: 那麽直接匹配這倆就行,為dp[i-1][j-1]

2. != 那麽隨便修改一下,比如修改word1[i-1] = word2[j-1], 為dp[i-1][j-1] + 1

3 在1中插入: 那麽就是用word1[0,i) 匹配word2[0,j-1) , 新插入的字符匹配word2[j-1],為dp[i][j-1] + 1

4 在2中插入,同理dp[i-1][j] + 1

求min即可。

為了不特判i=0或者j=0的情況(不然就沒有i-1/j-1了) ,預先處理為0的情況 dp[0][i] = i, dp[j][0] = j 。

code:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int len1 = word1.length(), len2 = word2.length();
        
if(len1 == 0) return len2; if(len2 == 0) return len1; vector<vector<int>>dp (len1 + 1, vector<int>(len2 + 1, INT_MAX)); dp[0][0] = 0; for(int i = 0; i <= len1; i++){ dp[i][0] = i; } for(int i = 0; i <= len2; i++){ dp[0][i] = i; } for(int i = 1; i <= len1; i++){ for(int j = 1; j <= len2; j++){ if(word1[i-1] == word2[j-1]) dp[i][j] = min(dp[i][j], dp[i-1][j-1]); // add char in word1 dp[i][j] = min(dp[i][j], dp[i][j-1] + 1); // add char in word2 dp[i][j] = min(dp[i][j], dp[i-1][j] + 1); // delete = insert // replace char dp[i][j] = min(dp[i][j], dp[i-1][j-1] + 1); } } return dp[len1][len2]; } };

leetcode 72. Edit Distance