思路:动态规划
状态dp(i,j)表示是s1(0-i),s2(0-j)的相同的最小步数
状态转移:
情况1:s1[i]==s2[j],不需要操作,dp(i-1,j-1)直接调过来
情况2:删除s1[i],由dp(i-1,j)进行删除操作
情况3:删除s2[j],由dp(i,j-1)进行删除操作
情况4:删除s1[i],s2[j],由于情况2、情况3包括了这种情况,故舍去这种情况。
#include<iostream>
#include<unordered_map>
#include<sstream>
using namespace std;
string s1="dinitrophenylhydrazine";
string s2="benzalphenylhydrazone";
unordered_map<string,int> memo;
int dp(int i,int j){
if(i==-1)
return j+1;
if(j==-1)
return i+1;
if(s1[i]==s2[j])
return dp(i-1,j-1);
string key;
stringstream st;
st<<i<<","<<j;
st>>key;
if(memo.count(key)==0)
memo[key]=min(dp(i-1,j)+1,dp(i,j-1)+1);
return memo[key];
}
int main()
{
cout<<dp(s1.size()-1,s2.size()-1);
return 0;
}