zoukankan      html  css  js  c++  java
  • [leetcode]Edit Distance

    动态规划,此题思考许久,出错不少。动态规划的转移方程倒是想出来了,转移方程的讨论可见:http://blog.unieagle.net/2012/09/19/leetcode%E9%A2%98%E7%9B%AE%EF%BC%9Aedit-distance%EF%BC%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%8B%E9%97%B4%E7%9A%84%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB%EF%BC%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/

    但是对于i==0和j==0时的计算,以至于a和aa,以及a和ba这样的例子都计算错过。

    后来看到一个用长度而非坐标来作为数组索引的,就更简单了:http://www.cnblogs.com/remlostime/archive/2012/11/06/2757668.html

    public class Solution {
        public int minDistance(String word1, String word2) {
            // Start typing your Java solution below
            // DO NOT write main() function
            int len1 = word1.length();
            int len2 = word2.length();
            if (len1 == 0) return len2;
            if (len2 == 0) return len1;
            int m[][] = new int[len1][len2];
            
            m[0][0] = word1.charAt(0) == word2.charAt(0) ? 0 : 1;
            for (int j = 1; j < len2; j++) {
                if (word1.charAt(0) == word2.charAt(j)) {
                    m[0][j] = j;
                }
                else {
                    m[0][j] = m[0][j-1]+1;
                }
            }
            
            for (int i = 1; i < len1; i++) {
                if (word1.charAt(i) == word2.charAt(0)) {
                    m[i][0] = i;
                }
                else {
                    m[i][0] = m[i-1][0]+1;
                }
            }
            
            for (int i = 1; i < len1; i++) {
                for (int j = 1; j < len2; j++) {
                    int x1 = m[i-1][j] + 1;
                    int x2 = m[i][j-1] + 1;
                    int x3 =  m[i-1][j-1];
                    if (word1.charAt(i) != word2.charAt(j)) x3++;
                    m[i][j] = Math.min(x1, Math.min(x2, x3));               
                }
            }
            return m[len1-1][len2-1];
        }
    }
    

     python3

    class Solution:
        def minDistance(self, word1: str, word2: str) -> int:
            # i, j for length
            # memo[i][j] = min(memo[i][j-1] + 1, memo[i-1][j] + 1 , memo[i-1][j-1] (if s[i-1] == t[j-1]) / memo[i-1][j-1] + 1)
            
            memo = {}
            memo[(0, 0)] = 0
            for i in range(len(word1) + 1):
                for j in range(len(word2) + 1):
                    if i == 0 and j == 0:
                        continue
                    step = float('inf')
                    if i > 0:
                        step = min(step, memo[(i-1, j)] + 1)
                    if j > 0:
                        step = min(step, memo[(i, j - 1)] + 1)
                    if i > 0 and j > 0:
                        if word1[i - 1] == word2[j - 1]:
                            step = min(step, memo[(i - 1, j - 1)])
                        else:
                            step = min(step, memo[(i - 1, j - 1)] + 1)
                    memo[(i, j)] = step
            return memo[(len(word1), len(word2))]
    

      

  • 相关阅读:
    django 2.0 path
    Django
    ORM
    Django简介
    web框架
    HTTP协议
    web应用
    索引
    pyMysql模块
    视图、触发器、存储过程、函数
  • 原文地址:https://www.cnblogs.com/lautsie/p/3251311.html
Copyright © 2011-2022 走看看