• [Leetcode] 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

    题意:通过每次只能插入、删除、替换一个字符,将给定字符word1转换为word2需要多少步。

    思路:动态规划,维护一个二维数组,其中,dp[i][j]表示,word1.substr(0,i)转换为word2.substr(0,j)(substr的区间是前闭后开型)最少需要的步数。若是当前字符,word1[i-1]等于word2[j-1],则说明,word1从substr(0,i-2)转换为word2不需要三种操作中的任一种,即:dp[i][j]=dp[i-1][j-1];若不相等,则由有三种情:从二维数组中,左、左上、上,中三种可以到达当前值的变化方式中选取最小值,然后加1即可。此时状态转移方程是:dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1])),规律还是相对比较难想的,多想意义。如当word1=“word”,word2=“wild”,二维数组如下:

    代码如下:

     1 class Solution {
     2 public:
     3     int minDistance(string word1, string word2) 
     4     {
     5         int len1=word1.size(),len2=word2.size();
     6         int dp[len1+1][len2+1];
     7         //初始化
     8         for(int i=0;i<=len1;++i) dp[i][0]=i;
     9         for(int i=0;i<=len2;++i) dp[0][i]=i;
    10 
    11         for(int i=1;i<=len1;++i)
    12         {
    13             for(int j=1;j<=len2;++j)
    14             {
    15                 if(word1[i-1]==word2[j-1])
    16                     dp[i][j]=dp[i-1][j-1];
    17                 else
    18                     dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
    19             }
    20         }    
    21         return dp[len1][len2];
    22     }
    23 };
  • 相关阅读:
    java程序高CPU,如何直接定位(linux系统下命令行操作)
    HashMap源码解读(jdk1.8)
    mysql索引原理
    redis常见问题
    Bitmap算法
    list遍历时删除的坑
    接口和抽象类有什么区别?各在什么场景下使用?
    记录BigInteger犯过的一个错误
    CentOS7切换源
    map遍历性能记录
  • 原文地址:https://www.cnblogs.com/love-yh/p/7124973.html
Copyright © 2020-2023  润新知