zoukankan      html  css  js  c++  java
  • [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

    这里我想解释一下 

    D[i,j] = D[i-1,j]+del[x(i)];

    D[i,j]表示X[1,i]到Y[1,j]的ED,D[i-1,j]表示X[1,i-1]到Y[1,j]的ED,而由X[1,i]到X[1,i-1]的步骤就是del[x(i)]

    同理,D[1,j-1]表示X[1,i]到Y[1,j-1]的ED,而由Y[1,i-1]到Y[1,i]的步骤就是ins[y(i)]

    小结一下

    思路:

    X[1,i]-->Y[1,j]有三中方法:

    1. 首先X[1,i]-->X[1,i-1] (就是del x(i)) ,然后X[1,i-1]-->Y[1,j]

    2 首先X[1,i]-->Y[1,j-1],然后Y[1,j-1]-->Y[1,j](就是ins y(j))

    3 就是X[1,i-1]-->Y[1,j-1],然后替换

    为什么不能X[i+1] --> X[i]; 是删除操作,其实说明X[i] -->X[i+1]是插入操作,他们是相互可以转变的

    考虑特殊情况Y为空串,那么X[1,i] -->Y 就需要 i 步骤,而X[1,i+1] -->Y 就需要 i +1步骤

    因此,我们考虑问题时X[1,i]-->Y[1,j]只关注 <=i, <=j 的情况,不关注大于i,j的情况

    考虑整个字符串 str1 和 str2 ,str1 写作&&&&&&&&&&&&&X,str2 写作%%%%%%%%%%%%%Y

    &&&&&&&&&&&&&X

    %%%%%%%%%Y

    就要考虑【&&&&&&&&&&&&&,%%%%%%%%%Y】【&&&&&&&&&&&&&X,%%%%%%%%%】【&&&&&&&&&&&&&,%%%%%%%%%】3中情况即可,所以子问题也考虑着三种情况

     1 class Solution {
     2     public:
     3         int minDistance(string word1, string word2)
     4         {   
     5             size_t size1 = word1.size();
     6             size_t size2 = word2.size();
     7 
     8             vector <vector<int> >f; 
     9             vector<int> a;
    10             a.resize(size2+1, 0); 
    11             for(int i = 0; i< size1+1; i++)
    12             {   
    13                 f.push_back(a);
    14             }   
    15 
    16             for(int i = 0; i<= size1; i++)
    17                 f[i][0] = i;
    18             for(int i = 0; i<= size2; i++)
    19                 f[0][i] = i;
    20 
    21             for(int i = 0; i< size1; i++)
    22             {   
    23                 for(int j = 0; j< size2; j++)
    24                 {   
    25 
    26                     int min1 = f[i][j+1];
    27                     min1 = min(min1, f[i+1][j]) + 1;
    28                     int min2 = f[i][j];
    29                     if(word1[i] != word2[j])
    30                         min2++;
    31                     f[i+1][j+1]= min(min1, min2);
    32                 }
    33             }
    34 
    35             return f[size1][ size2];
    36         }
    37 };
  • 相关阅读:
    harbor 报错,注意harbor.yml文件格式。
    nginx中rewrite文件
    改善github网络连接
    代码层实现六种质量属性战术
    读漫谈架构有感
    “淘宝网”的六个质量属性的六个常见属性
    寒假学习进度16:tensorflow2.0 波士顿房价预测
    寒假学习进度15:tensorflow2.0 优化器
    寒假学习进度14:对mnist数据集实现逻辑回归
    寒假学习进度13:tensorflow2.0 mnist简介
  • 原文地址:https://www.cnblogs.com/diegodu/p/3824860.html
Copyright © 2011-2022 走看看