動態規劃-LeetCode72-編輯距離
阿新 • • 發佈:2018-12-04
題目
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。 你可以對一個單詞進行如下三種操作: 插入一個字元 刪除一個字元 替換一個字元 示例 1: 輸入: word1 = "horse", word2 = "ros" 輸出: 3 解釋: horse -> rorse (將 'h' 替換為 'r') rorse -> rose (刪除 'r') rose -> ros (刪除 'e') 示例 2: 輸入: word1 = "intention", word2 = "execution" 輸出: 5 解釋: intention -> inention (刪除 't') inention -> enention (將 'i' 替換為 'e') enention -> exention (將 'n' 替換為 'x') exention -> exection (將 'n' 替換為 'c') exection -> execution (插入 'u')
思路
一般思路無從下手。採用動態規劃。初始化矩陣 int[word1.length()+1][word2.length()+1]。int[i][j]代表word1的i-1之前的字串變為word2的j-1之前的字串所使用的最小運算元。int[word1.length()][word2.length()]即為所求。
1. 初始化m[0][0]=0
2. 初始化m[0][j]、m[i][0]
3. 之後按行初始化m[i][j]
m[i][j] = min( 左+1,上+1, 左上+0 or 左上+1(根據是否相等) )。
程式碼
class Solution { public int minDistance(String word1, String word2) { int[][] m=new int[word1.length()+1][word2.length()+1]; m[0][0]=0; for(int i=1;i<word1.length()+1;i++){ m[i][0]=i; } for(int i=1;i<word2.length()+1;i++){ m[0][i]=i; } for(int i=1;i<word1.length()+1;i++){ for(int j=1;j<word2.length()+1;j++){ int min=m[i-1][j-1]; if(word1.charAt(i-1)==word2.charAt(j-1)){ }else{ min++; } min=Math.min(min,Math.min(m[i-1][j]+1,m[i][j-1]+1)); m[i][j]=min; } } return m[word1.length()][word2.length()]; } }
關鍵
動態規劃