Edit Distance - LeetCode


Edit Distance - LeetCode
タイトル:
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分析:
この問題は、1つの文字列が別の文字列に編集される最小操作数を求めます.操作には、1つの文字の追加、削除、または置換が含まれます.このテーマは2次元のダイナミックプランニングを用いており,m[i][j]がword 1の前i文字とword 2の前j文字の前の最小オペランド数を表していると仮定し,m[i][j]になるとword 1[i-1]=word 2[j-1]となるとm[i][j]=m[i-1][j-1となり,より動く必要がないため,前i-1とj-1の文字の最小オペランド数と等しい.そしてword 1[i-1]!=word 2[j-1]では,3つのケースがある.word 1は1つの値を挿入し、このときm[i][j]=m[i-1][j]+1は、word 1の前のi-1文字とword 2の前のj文字の最良の結果にこの操作を加える.2.word 2は1つの値を挿入し、このときm[i][j]=m[i][j-1]+1は、word 1の前のi文字とword 2の前のj-1文字の最良の結果にこの操作を加える.3 .word 1は1つの値を変更し、このときm[i][j]=m[i-1][j-1]+1は、word 1の前のi-1文字とword 2の前のj-1文字の最良の結果にこの操作を加えます.明らかに、m[0][0-len(word 2)]の値は0-len(Word 2)であり、word 1の最初の0文字には文字がないので、word 2と等しくしたいのですが、文字を加えるしかなく、word 2の長さと等しいです.同じ理屈m[0-len(word 1)][0]でも同じです.
コード:
class Solution:
    # @return an integer
    def minDistance(self, word1, word2):
        m,n = len(word1), len(word2)
        if m == 0 : return n
        if n == 0 : return m
        edit = [j for j in range(n+1)] 
        for i in range(1, m+1):
            left_top, edit[0] = edit[0], i #   edit[0] = i  left_top  edit[0]
            for j in range(1, n+1):
                left_top, edit[j] = edit[j], min( edit[j] + 1, edit[j - 1] + 1, left_top + (0 if word1[i-1] == word2[j-1] else 1))  #      left_top      edit[j],       left_top        m[i-1][j-1] ,    edit[j]       m[i-1][j],edit[j-1]       m[i][j-1]
        return edit[n]