編輯距離??!超經(jīng)典動(dòng)態(tài)規(guī)劃

給定兩個(gè)單詞 word1 和 word2,計(jì)算出將 word1 轉(zhuǎn)換成 word2 所使用的最少操作數(shù) 可以對(duì)一個(gè)單詞進(jìn)行如下三種操作:

  • 插入一個(gè)字符
  • 刪除一個(gè)字符
  • 替換一個(gè)字符

舉例說(shuō)明:

輸入: word1 = "horse", word2 = "ros"
輸出: 3
解釋:
horse -> rorse (將 'h' 替換為 'r')
rorse -> rose (刪除 'r')
rose -> ros (刪除 'e')

解釋:動(dòng)態(tài)規(guī)劃法dp[i][j]表示 word1的前i個(gè)字符與word2的前j個(gè)字符之間的編輯距離,則當(dāng)i||j==0時(shí), dp[i][j] = 0+max(i,j).這一點(diǎn)很好理解。
一般情況:
如果word1[i-1][j-1] = = word 2[i-1][j-1] 時(shí),則有:

  • dp[i][j] = min(dp[i-1][j-1],min(dp[i][j-1]+1,dp[i-1][j]+1));

如果word1[i-1][j-1] != word 2[i-1][j-1]時(shí),則有:

  • dp[i][j] = dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;
class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1,0));
        for(int i=0; i<dp.size();i++){
            for(int j=0;j<dp[0].size();j++){
                if(i==0||j==0) dp[i][j] = i+j;
                else if(word1[i-1]==word2[j-1]){
                    dp[i][j] = min(dp[i-1][j-1],min(dp[i][j-1]+1,dp[i-1][j]+1));
                }
                else  dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1; 
            }
        }
        return dp[word1.size()][word2.size()];
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容