• 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分别为:michaelab和michaelxy(为了理解简单,我们假设word1和word2字符长度是一样的),dis[i][j]作为word1和word2之间的Edit Distance,我们要做的就是求出michaelx到michaely的最小steps。

    首先解释下dis[i][j]:它是指word1[i]和word2[j]的Edit Distance。dis[0][0]表示word1和word2都为空的时候,此时他们的Edit Distance为0。很明显可以得出的,dis[0][j]就是word1为空,word2长度为j的情况,此时他们的Edit Distance为j,也就是从空,添加j个字符转换成word2的最小Edit Distance为j;同理dis[i][0]就是,word1长度为i,word2为空时,word1需要删除i个字符才能转换成空,所以转换成word2的最小Edit Distance为i。下面及时初始化代码:

      vector<vector<int> > dis(row, vector<int>(col));
           for (int i = 0; i < row; i++) dis[i][0] = i;
           for (int j = 0; j < col; j++) dis[0][j] = j;

    下面来分析下题目规定的三个操作:添加,删除,替换。

    假设word1[i]和word2[j](此处i = j)分别为:michaelab和michaelxy

    显然如果b==y, 那么dis[i][j] = dis[i-1][j-1]。

    如果b!=y,那么:

    添加:也就是在michaelab后面添加一个y,那么word1就变成了michaelaby,此时

    dis[i][j] = 1 + dis[i][j-1];

    上式中,1代表刚刚的添加操作,添加操作后,word1变成michaelaby,word2为michaelxy。dis[i][j-1]代表从word[i]转换成word[j-1]的最小Edit Distance,也就是michaelab转换成michaelx的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaelab变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i][j-1]。

    删除:也就是将michaelab后面的b删除,那么word1就变成了michaela,此时

    dis[i][j] = 1 + dis[i-1][j];

    上式中,1代表刚刚的删除操作,删除操作后,word1变成michaela,word2为michaelxy。dis[i-1][j]代表从word[i-1]转换成word[j]的最小Edit Distance,也就是michaela转换成michaelxy的最小Edit Distance,所以只需要将michaela变成michaelxy就可以了,而他们之间的最小Edit Distance就是dis[i-1][j]。

    替换:也就是将michaelab后面的b替换成y,那么word1就变成了michaelay,此时

    dis[i][j] = 1 + dis[i-1][j-1];

    上式中,1代表刚刚的替换操作,替换操作后,word1变成michaelay,word2为michaelxy。dis[i-1][j-1]代表从word[i-1]转换成word[j-1]的最小Edit Distance,也即是michaelay转换成michaelxy的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaela变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i-1][j-1]。

    最后只需要看着三种方案哪种最小,就采用哪种的编辑方案。

    C++实现代码:

    #include<iostream>
    #include<string>
    using namespace std;
    
    class Solution {
    public:
        int minDistance(string word1, string word2) {
            int m=word1.length();
            int n=word2.length();
            int edit[m+1][n+1];
            int i,j;
            for(i=0;i<=m;i++)
                edit[i][0]=i;
            for(j=0;j<=n;j++)
                edit[0][j]=j;
            for(i=1;i<=m;i++)
            {
                for(j=1;j<=n;j++)
                {
                    if(word1[i-1]==word2[j-1])
                        edit[i][j]=edit[i-1][j-1];
                    else
                    {
                        edit[i][j]=min(edit[i-1][j-1]+1,min(edit[i-1][j]+1,edit[i][j-1]+1));
                    }
                }
            }
            return edit[m][n];
        }
    };
    
    int main()
    {
        Solution s;
        string s1="eeba";
        string s2="abca";
        cout<<s.minDistance(s1,s2)<<endl;
    }
  • 相关阅读:
    【命令模式】设计模式之命令模式【原创】
    github page搭建自己的页面
    this request has been blocked;the content must be served over https
    【转载】wamp安装ssl证书
    【函数】register_shutdown_function函数详解【原创】
    08 SSM整合案例(企业权限管理系统):10.权限关联与控制
    删除某些自启动弹窗的默认路径
    08 SSM整合案例(企业权限管理系统):09.用户和角色操作
    08 SSM整合案例(企业权限管理系统):08.权限控制
    08 SSM整合案例(企业权限管理系统):07.订单操作
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4130226.html
Copyright © 2020-2023  润新知