在C ++中删除两个字符串的操作
假设我们有两个单词w1和w2,我们必须找到使w1和w2相同所需的最小步骤数,其中在每个步骤中我们都可以删除任一字符串中的一个字符。因此,如果输入像“sea”和“eat”,那么输出将为2,因为我们需要从w1中删除“s”,所以它将为“ea”,并从w2中从“eat”中删除“t”。然后它们是相同的。
为了解决这个问题,我们将按照以下步骤
n:=s1的大小,m:=s2的大小
在字符串s1和s2之前添加一个空格,然后相应地更新s1和s2
制作一张大小为(n+1)x(m+1)的桌子
对于我:=1到m
dp[0,i]:=dp[0,i-1]+1
对于我:=1到n
dp[i,0]:=dp[i–1,0]+1
对于我在1到n范围内
如果s1[i]=s2[j]
否则dp[i,j]=dp[i–1,j]+1和dp[i,j-1]+1的最小值
dp[i,j]:=dp[i–1,j-1]
对于1到m范围内的j
返回dp[n,m]
例子(C++)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minDistance(string s1, string s2) {
int n = s1.size();
int m = s2.size();
s1 = " " + s1;
s2 = " " + s2;
vector < vector <int> > dp(n + 1, vector <int>(m + 1));
for(int i = 1; i <= m; i++){
dp[0][i] = dp[0][i - 1] + 1;
}
for(int i = 1; i <= n; i++){
dp[i][0] = dp[i - 1][0] + 1;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(s1[i] == s2[j]){
dp[i][j] = dp[i - 1][j - 1];
}
else{
dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
}
}
}
return dp[n][m];
}
};
main(){
Solution ob;
vector<int> v = {1,1,1};
cout << (ob.minDistance("sea", "eat"));
}输入值
"sea" "eat"
输出结果
2