您的位置:首页 > 其它

相似字符串(字符串编辑)最短距离(非递归版本)

2013-10-07 13:59 197 查看
第一次写的递归版本:点击打开链接,速度太慢了,基本case都超时,重新写一个非递归的
/*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
*/

#include <string>
#include <iostream>

class Solution
{
public:
int minDistance(std::string word1,std::string word2)
{
/*return minDistanceHelper(word1.begin(),
word1.end(),
word2.begin(),
word2.end()
);*/ //recursive version
//non recursive version
if(word1.size()==0)
return word2.size();
if(word2.size()==0)
return word1.size();
int matrix[word1.size()+1][word2.size()+1];
for(size_t i=0;i<=word1.size();++i)
matrix[i][0]=i;
for(size_t i=0;i<=word2.size();++i)
matrix[0][i]=i;
for(int i=1;i<=word1.size();++i)
{
for(int j=1;j<=word2.size();++j)
{
if(word1[i-1]==word2[j-1])
matrix[i][j]=matrix[i-1][j-1];
else
{
int c1=matrix[i-1][j-1];//replace
int c2=matrix[i-1][j]; //delete
int c3=matrix[i][j-1]; //insert
matrix[i][j]=1+(c1<=c2?(c1<=c3?c1:c3):(c2<=c3?c2:c3));
}
}
}
return matrix[word1.size()][word2.size()];
}
private:
//recursive version with no state
int minDistanceHelper(std::string::iterator lbegin,
std::string::iterator lend,
std::string::iterator rbegin,
std::string::iterator rend)
{
if(lbegin==lend)
return rend-rbegin; //insert charater
else if(rbegin==rend)
return lend-lbegin; //delete charater
else if(*lbegin==*rbegin)
{
return minDistanceHelper(lbegin+1,lend,rbegin+1,rend);
}
else
{
int c1=1+minDistanceHelper(lbegin+1,lend,rbegin,rend);//delete
int c2=1+minDistanceHelper(lbegin,lend,rbegin+1,rend);//insert
int c3=1+minDistanceHelper(lbegin+1,lend,rbegin+1,rend);//replace
return c1<=c2?(c1<=c3?c1:c3):(c2<=c3?c2:c3);
}
}
};

int main(int argc,char* argv[])
{
std::string one("b");
std::string two("a");
Solution s;
std::cout<<s.minDistance(one,two)<<std::endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: