编辑距离(一),动态规划,空间O(min(m,n)

尾部元素str[i]和str[j]相等,不用编辑,编辑距离就是str1[:i]到str2[:j]的编辑距离。
尾部元素str[i]和str[j]不等:修改,对应的编辑距离是str1[:i]到str2[:j]的编辑距离+1。
尾部元素str[i]和str[j]不等:删除,对应的编辑距离是str1[:i]到str2[:j+1]的编辑距离+1。
尾部元素str[i]和str[j]不等:添加,对应的编辑距离是str1[:i+1]到str2[:j]的编辑距离+1。

class Solution:
    def editDistance(self , str1: str, str2: str) -> int:
        if len(str1) < len(str2):     # str2取小者
            str1, str2 = str2, str1
        m, n = len(str1), len(str2)
        dp = [j for j in range(n+1)]
        for i in range(m):
            dp[0] = i                   # 空-i个字符的编辑距离为i
            top_left = dp[0]                
            for j in range(n):
                if str2[j] == str1[i]:
                    tmp = dp[j+1]       # 当前的上方,等于下一个的左上方
                    dp[j+1] = top_left
                    top_left = tmp
                else:
                    tmp = dp[j+1]
                    dp[j+1] = min(dp[j+1], dp[j], top_left)+1
                    top_left = tmp
        return dp[-1]