題目大意:給定兩個字串,求解將 word1 轉化成 word2 的最小操作。操作有三個,替換,增加和刪除。
題目分析:突然給定乙個這樣的題目,求解有效可能集合中的最優解。第一想法當然就想到了動態規劃,可是怎麼找狀態轉移方程呢?又應該選擇哪個狀態呢?一般能想到兩個,乙個是dp[i][j], 表示長度為 i 的word1 轉化為長度為 j 的word2所需要的最小運算元;另乙個就是用一維陣列了,dp[i] 表示長度為 i 的word1轉化成word2所需的最小運算元(i也可用來表示word2長度)。這裡只是兩種初步可能的表達,是否合適還要繼續分析,這裡我選擇了二維陣列的表示方法,因為一維的想不出(可能別人有這個解法)。
既然確定了求解的狀態,那是否滿足狀態轉移呢?當然這裡是有的,有 dp[i-1][j-1] 到 dp[i][j] 的狀態轉移(dp[i][j])。現在來分析 dp[i][j] 的可能構成:word1 到 word2有三種操作
1)如果word1[i]==word2[j], 那麼dp[i][j] = dp[i-1][j-1]. 當然可能有人會說還有,dp[i-1][j] + 1(刪除word[i], 加上dp[i-1][j]), 甚至有dp[i][j-1]+1 (表示 新增乙個 word1[i+1]=word2[j], 從而加上dp[i][j-1])。但其實是不可能的,其實dp[i-1][j-1]<=dp[i][j-1]+1 , dp[i-1][j]+1,這個自己演算一下就知道了。
2) 如果word1[i]!=word2[j],那麼現在這上面分析的三種情況可能發生了:
dp[i-1][j-1] +1:同上分析,表示將word1[i] 替換成 word2[j],加上dp[i-1][j-1]
dp[i-1][j] +1 :表示刪除word[i], 加上dp[i-1][j]
dp[i][j-1] +1 :表示 插入乙個 word1[i+1]=word2[j], 從而加上dp[i][j-1]
分析完畢,編碼階段。直接給出**:
class solution ; // 為了避免邊界討論,陣列開大了一點
for(int i=0;i<=len1;i++)
for(int i=0;i<=len2;i++)
for(int i=0;ilen這樣遍歷
動態規劃之LeetCode第72題 編輯距離
首先先學習乙個經典的演算法吧,就是和本題一模一樣的 編輯距離演算法 編輯距離,minimum edit distance,簡稱med,是俄羅斯科學家 vladimir levenshtein 在1965年提出,也因此而得名 levenshtein distance。用來度量兩個序列相似程度的指標。通...
LeetCode第72題(編輯距離)
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...
leetcode習題集 72 編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...