LeetCode - Edit Distance

https://leetcode.com/problems/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

典型的DP題,用二維DP很容易就做出來了。

distance[i][j]表示word1的前i個字符到word2的前j個字符的距離。

遞推公式是:

1. 如果word.charAt(i-1) == word.charAt(j-1), 那麼distance[i][j] = distance[i-1][j-1]

2. 否則,就是distance[i-1][j], distance[i][j-1], distance[i][j]的最小值加1.

當i==0 或者 j==0的話,那就只能插入或刪除,distance[i][j]就等於j或者i.

public class Solution {
    public int minDistance(String word1, String word2) {
        if(word1 == null || word1.length()==0) return word2==null? 0 : word2.length();
        if(word2 == null || word2.length()==0) return word1==null? 0 : word1.length();
        
        int[][] distance = new int[word1.length()+1][word2.length()+1];
        distance[0][0] = 0;
        for(int i=0; i<=word1.length(); i++){
            for(int j=0; j<=word2.length(); j++){
                if(i==0 && j==0) continue;
                if(i==0){
                    distance[i][j] = j;
                    continue;
                }
                if(j==0){
                    distance[i][j] = i;
                    continue;
                }
                if(word1.charAt(i-1)==word2.charAt(j-1)){
                    distance[i][j] = distance[i-1][j-1];
                }
                else{
                    distance[i][j] = Math.min(Math.min(distance[i-1][j], distance[i][j-1])+1, distance[i-1][j-1]+1);
                }
            }
        }
        return distance[word1.length()][word2.length()];
    }
}

不能用一維DP做哈,

distance[i][j] = Math.min(Math.min(distance[i-1][j], distance[i][j-1])+1, distance[i-1][j-1]+1);
這一句,同時用到了上一輪的j-1和這一輪的j-1,所以一維數組肯定不行,因爲一維的話就只能保存一輪的distance值了。

時間複雜度和空間複雜度都是O(m*n)


發佈了129 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章