1. 程式人生 > >LeetCode-72.Edit Distance

LeetCode-72.Edit Distance

lac length words pre turn 前行 ret cte etc

Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.

You have the following 3 operations permitted on a word:

  1. Insert a character
  2. Delete a character
  3. Replace a character

Example 1:

Input: word1 = "horse", word2 = "ros"
Output: 3
Explanation: 
horse -> rorse (replace ‘h‘ with ‘r‘)
rorse -> rose (remove ‘r‘)
rose -> ros (remove ‘e‘)

Example 2:

Input: word1 = "intention", word2 = "execution"
Output: 5
Explanation: 
intention -> inention (remove ‘t‘)
inention -> enention (replace ‘i‘ with ‘e‘)
enention -> exention (replace ‘n‘ with ‘x‘)
exention -> exection (replace ‘n‘ with ‘c‘)
exection -> execution (insert ‘u‘)

時間復雜度為O(mn)
public int minDistance(String word1, String word2) {//dp mytip
        int[][] dp = new int[word1.length()+1][word2.length()+1];//word1前i個字符和word2前j個字符最少的改變次數
        for(int i=1;i<=word1.length();i++){//相當於word1和word2前同時加一個相同的字符,並初始化
            dp[i][0] = i;
        }
        for(int
i=1;i<=word2.length();i++){ dp[0][i]=i; } for(int i=0;i<word1.length();i++){ for(int j=0;j<word2.length();j++){ if(word1.charAt(i)==word2.charAt(j)){//如果i和j相同不需要操作 dp[i+1][j+1]=dp[i][j]; } else{//如果不同,判斷增刪改,哪個操作更少 int min = dp[i][j+1]>dp[i+1][j]?dp[i+1][j]:dp[i][j+1]; min = min>dp[i][j]?dp[i][j]:min; dp[i+1][j+1]=min+1; } } } return dp[word1.length()][word2.length()]; }

空間上可優化 只保存當前行和上一行

LeetCode-72.Edit Distance