《编程之美》3.3节:计算字符串的相似度
问题:对于给定的两个字符串,用最少的操作:插入、删除和替换,使得两个字符串相同。找出这个最少需要操作的步数。
解法:1)一步操作后,再将A[2:end]和B[2:end]编程相同的字符串
2)一步操作后,再将A[1:end]和B[2:end]编程相同的字符串
3)一步操作后,再将A[2:end]和B[1:end]编程相同的字符串
代码:
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
int calculateStringdistance(string s1,int s1Begin,string s2,int s2Begin)
{
if(s1Begin>=s1.size())
{
if(s1Begin>s2.size())
return 0;
else
return s2.size()-s2Begin;
}
if(s2Begin>=s2.size())
{
if(s2Begin>s1.size())
return 0;
else
return s1.size()-s1Begin;
}
if(s1[s1Begin]==s2[s2Begin])
return calculateStringdistance(s1,s1Begin+1,s2,s2Begin+1);
else
{
int t1=calculateStringdistance(s1,s1Begin,s2,s2Begin+1);
int t2=calculateStringdistance(s1,s1Begin+1,s2,s2Begin);
int t3=calculateStringdistance(s1,s1Begin+1,s2,s2Begin+1);
return min(t1,min(t2,t3))+1;
}
}
int main()
{
string s1="abcdefg";
string s2="abceef";
int result=calculateStringdistance(s1,0,s2,0);
cout<<result<<endl;
system("pause");
return 0;
}
另外:可以参考《leetcode题解》中Edit Distance题目的动态规划的解法,