Edit Distance--LeetCode

来源:互联网 发布:spss数据差异性分析 编辑:程序博客网 时间:2024/06/05 08:16

题目:

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

这也是一个典型的DP问题,我们同样需要一个记录变量,dp[i][j],记录包括word1[i]在内的字符串和包括word2[j+1]
在内的字符串的编辑距离,
那么如果word1[i+1] == word2[j+1] dp[i+1][j+1] = dp[i][j],否则  dp[i+1][j+1] = dp[i][j]+1,
不过也有可能dp[i+1][j+1] = dp[i+1][j]+1 或者dp[i][j+1]+1
实际上 dp[i+1][j+1]应该是三种情况的最小值

我们来分析下为什么是这三种情况中的最小值。这个题目是编程之美中的题目,我借用编程之美中的解释来说明一下,考虑如何才能把这个问题转化成规模较小的同样的问题。如果有两个串A=xabcdae和B=xfdfa,他们的第一个字符是相同的,只要计算A【2....7】和B[2....5]的距离就可以了。但是如果两个串的第一个字符不相同。那么可以通过如下的操作(lenA和lenB分别是A串和B串的长度)

     1、删除A串的第一个字符,然后计算A[2....lenA]和B[1,,,,,,lenB]的距离

     2、删除B串的第一个字符,然后计算A[1....lenA]和B[2,,,,,,lenB]的距离

    3、修改A串的第一个字符为B串的第一个字符,然后计算A[2....lenA]和B[2,,,,,,lenB]的距离

   4、修改B串的第一个字符为A串的第一个字符,然后计算A[2....lenA]和B[2,,,,,,lenB]的距离

   5、增加B串的第一个字符到A串的第一个字符之前,然后计算A[1....lenA]和B[2,,,,,,lenB]的距离

   6、增加A串的第一个字符到B串的第一个字符之前,然后计算A[2....lenA]和B[1,,,,,,lenB]的距离

#include <iostream>#include <vector>#include <string>#include <limits>using namespace std; int Edit_distance(string& s1,string& s2){vector<vector<int> > dp(s1.size());int i,j;for(i=0;i<dp.size();i++)dp[i].assign(s2.size(),numeric_limits<int>::max());if(s1[0]==s2[0])dp[0][0] =0;elsedp[0][0] =1;for(i=1;i<dp[0].size();i++)if(s1[0] == s2[i])dp[0][i] = i;elsedp[0][i] = dp[0][i-1]+1;for(i=1;i<dp.size();i++)if(s1[i] == s2[0])dp[i][0] = i;elsedp[i][0] = dp[i-1][0]+1; for(i=1;i<dp.size();i++){for(j=1;j<dp[0].size();j++){if(s1[i] == s2[j])dp[i][j] = dp[i-1][j-1];elsedp[i][j] = min(dp[i-1][j-1]+1,min(dp[i][j-1]+1,dp[i-1][j]+1)); }}return dp[s1.size()-1][s2.size()-1];}int main() {string s1("abcd");string s2("adc");cout<<Edit_distance(s1,s2)<<endl;;cout<<minDistance(s1,s2)<<endl;return 0;}

不过在申请空间时,也可以多申请一个,比需要的空间大一,DP问题在知道了方程以后,还需要注意的就是初始化。对变量的初始化过程也是非常重要的。

0 0