此题是一个动规二维动态规划问题。单词有停用词,所以要开始动规之前需要进行预处理,将两个字符出现的停用词去掉。
动规三部法:
1.明确dp[i][j]的含义,即前A中第i个单词,前B中第j个单词的最小编辑距离。
2.明确转移方程:
3.初始化
当第0个单词时,无论第0列还是第0行都是其行数(单词数量)。因为,A中0个单词和B中第1,2,3,4,5…单词匹配,需要的最小编辑距离就是1.2,3,4…
C++实现
#include <bits/stdc++.h>
using namespace std;
int main()
{
unordered_set<string> stop;
string word;
vector<string> A,B;
while(cin >> word)
{
stop.insert(word);
if(cin.get() == '\n') break;
}
for(int i = 0;i < 2;i++)
{
while(cin >> word)
{
if(stop.count(word)) continue;
if(i == 0)
A.push_back(word);
else
B.push_back(word);
if(cin.get() == '\n') break;
}
}
int n1 = A.size();
int n2 = B.size();
//dp的内涵:dp[i][j] ,A中第i个单词,B中第j个单词的最小编辑距离
vector<vector<int>> dp(n1+1, vector<int>(n2+1, 0));
for(int i = 1;i <= n1;i++) dp[i][0] = i;
for(int i = 1;i <= n2;i++) dp[0][i] = i;
for(int i = 1;i <= n1;i++)
{
for(int j = 1;j <= n2;j++)
{
if(A[i-1] == B[j-1])
dp[i][j] = dp[i-1][j-1];
else // 两个字符串不一致,从 删除A中的当前单词或者删除B中的当前单词,或者调整其中一个单词。
dp[i][j] = 1 + min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]));
}
}
cout << dp[n1][n2] << endl;
return 0;
}