• [LeetCode] Edit Distance


    (Version 0.0)

    这题是算法导论的书后习题,也是迄今为止LeetCode上面第二个我没想太长时间就直接放弃的题。第一个主动放弃的是Valid Number,那个题是因为嫌繁琐没什么太大意义,而这一个题则是感觉难度真的很大,如果之前没看过相关的东西的话自己做我觉得比AC Rate所体现的其实要难得多。

    根据这个博客(http://www.cnblogs.com/TenosDoIt/p/3465316.html)里的说法,这一题的核心模型是:构建的二维数组中的元素dp[i][j]表示word1的前i个字符构成的substring和word2的前j个字符构成的substring所需要的min edit distance。若两个string中当前考虑的char是相同的,则dp[i][j] = dp[i - 1][j - 1],因为从(i-1, j-1)匹配进化到(i, j)匹配不需要额外edit;若两个string中当前考虑的char不同,则有三种操作可以做:

    1.insert,即给word1的当前subsring的结尾插入一个和word2当前substring结尾相同的char。此时应该去找的二维数组dp中的元素不太容易想清楚,应该是word1的前i - 1个char构成的substring和word2的前j个构成的substring的edit distance,因为我们要做的事情是确保word1的以i结尾的substring经过修改得到和word2的以j - 1结尾的substring相匹配,只有这样我们才能在word1尾巴上插入一个在word2中j位置的char后使得其依然匹配word2以j结尾。所以这个时候我们需要考虑的dp中的元素是dp[i][j - 1]。

    2.delete,即删除word1的当前在i的char,这样我们需要考虑的东西很简单,就是word1的以i-1结尾的substring到word2以j结尾的substring的edit distance。所以这个时候我们要考虑的dp中的元素是dp[i - 1][j]。

    3.replace,即把word1的当前在i的char替换成word2的当前在j的char,这时我们只需要保证word1的前i - 1个和word2的前j - 1个相匹配,所以要考虑的dp中的元素是dp[i - 1][j - 1]。

    以上三个可能性中去最小的cost,然后再加1,即是我们当前考察的dp[i][j]要取的值。

    这个模型建立好之后,代码倒是非常地简单:

     1 public class Solution {
     2     public int minDistance(String word1, String word2) {
     3         int len1 = word1.length();
     4         int len2 = word2.length();
     5         int[][] dp = new int[len1 + 1][len2 + 1];
     6         for (int i = 0; i <= len1; i++) {
     7             dp[i][0] = i;
     8         }
     9         for (int i = 0; i <= len2; i++) {
    10             dp[0][i] = i;
    11         }
    12         for (int i = 1; i <= len1; i++) {
    13             for (int j = 1; j <= len2; j++) {
    14                 if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
    15                     dp[i][j] = dp[i - 1][j - 1];
    16                 } else {
    17                     dp[i][j] = 1 + Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1]));
    18                 }
    19             }
    20         }
    21         return dp[len1][len2];
    22     }
    23 }

    跋:根据code ganker在自己的博客里写的,这题在面试时做时间还是太紧了,不过他在面Google的时候碰到过变形题,是问判断word1和word2的edit distance是不是1,想想怎么做?

  • 相关阅读:
    2013.4.15 Particle Swarm Optimization with Skyline Operator for Fast Cloudbased Web Service Composition
    Adaptive service composition in flexible processes
    2013.4.13 DomainSpecific Service Selection for Composite Services
    2013.4.14 Modeling and Algorithms for QoSAware Service Composition in VirtualizationBased Cloud Computing
    2013.5.29 Towards Networkaware Service Composition in the Cloud
    Efficient algorithms for Web services selection with endtoend QoS constraints
    SQL Server中常用的SQL语句
    接口限流自定义注解
    linux服务器生产环境搭建
    MVEL自定义函数重复掉用报错:duplicate function
  • 原文地址:https://www.cnblogs.com/icecreamdeqinw/p/4324980.html
Copyright © 2020-2023  润新知