码迷,mamicode.com
首页 > 其他好文 > 详细

Edit Distance

时间:2014-11-29 11:40:36      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   for   strong   

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;
}

 

Edit Distance

标签:style   blog   io   ar   color   os   sp   for   strong   

原文地址:http://www.cnblogs.com/wuchanming/p/4130226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!