Leetcode72 Edit Distance
阿新 • • 發佈:2018-01-28
pub java insert red void font out light ont
72. Edit Distance
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
Tips: 本題是一道動態規劃問題,到當前字符要移動步數的步數,有到前一個字符移動步數決定。
dp[i][j]表示從word1前i個字符轉換到word2前j個字符最少的步驟數。
從word1轉換為Word2,能進行的才操作包括插入、刪除、與替換。
①插入:dp[i][j]等於包括字符i-1之前的所有字符轉換為包括j字符之前的所有字符的步數加一。即
insert=dp[i-1][j]+1;
②刪除:dp[i][j]等於包括字符i之前的所有字符轉換為包括j-1字符之前的所有字符的步數加一。即
del=dp[i][j-1]+1;
③替換:dp[i][j]等於包括字符i-1之前的所有字符轉換為包括j-1字符之前的所有字符的步數加一。即
change=dp[i-1][j-1]+1;
dp[i][j]最終的值應為以上三個數值的最小值。
當 word1與word2遇到一樣的字符dp[i][j]=dp[i-1][j-1];
package hard; public class L72EditDistance { public int minDistance(String word1, String word2) { //dp二維數組表示從word1的第i個位置轉換為word2的第j個位置需要的步數。 int len1=word1.length(); int len2=word2.length(); int[][]dp = new int[len1+1][len2+1]; int length=len1>len2?len1:len2; for(int i=0;i<=len1;i++){ dp[i][0]=i; } for(int j=0;j<=len2;j++){ dp[0][j]=j; } for(int i=1;i<=len1;i++){ char ch1=word1.charAt(i-1); for(int j=1;j<=len2;j++){ char ch2=word2.charAt(j-1); //當前word1字符等於word2字符,則dp[i][j]=dp[i-1][j-1]; if(ch1==ch2){ dp[i][j]=dp[i-1][j-1]; }else{ int insert=dp[i-1][j]+1; int del=dp[i][j-1]+1; int change=dp[i-1][j-1]+1; int min=Math.min(insert,del); min=Math.min(min,change); dp[i][j]=min; } } } return dp[len1][len2]; } public static void main(String[] args) { String word1="hello"; String word2="hallo"; L72EditDistance l72=new L72EditDistance(); int count = l72.minDistance(word1, word2); System.out.println(count); } }
Leetcode72 Edit Distance