一、题目描述
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例如下:
输入:
horse
ros
输出:3
二、思路
按照动态规划的解题步骤:
- 确定dp数组的含义
dp[i][j] 表示的是以以i-1为结尾的字符串s,和以j-1位结尾的字符串t,最近编辑距离为dp[i][j]。 - 确定递推公式
if(s[i-1]==t[j-1]){
dp[i][j]=dp[i-1][j-1];
}else{
dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
dp[i][j] = min(dp[i - 1][j - 1], dp[i][j]) + 1;
}
- dp数组初始化
//dp数组初始化
for(int i=0;i<=length1;i++){
dp[i][0]=i;
}
for(int j=0;j<=length2;j++){
dp[0][j]=j;
}
三、C++代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 10010
int dp[maxn][maxn]; //dp[i][j] 表示的是以以i-1为结尾的字符串s,和以j-1位结尾的字符串t,最近编辑距离为dp[i][j]。
int main(){
string s,t;
cin>>s>>t;
int length1=s.size();
int length2=t.size();
//dp数组初始化
for(int i=0;i<=length1;i++){
dp[i][0]=i;
}
for(int j=0;j<=length2;j++){
dp[0][j]=j;
}
//确定递推公式
for(int i=1;i<=length1;i++){
for(int j=1;j<=length2;j++){
if(s[i-1]==t[j-1]){
dp[i][j]=dp[i-1][j-1];
}else{
dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
dp[i][j] = min(dp[i - 1][j - 1], dp[i][j]) + 1;
}
}
}
cout<<dp[length1][length2];
}