计算出最接近的单词
通过最小的改动,使2个单词相同。
- 从第一个单词wordA,到第二个单词wordB,有三种操作:
- 删除一个字符
- 添加一个字符
- 替换一个字符
综合上述三种操作,用最少步骤将单词wordA变到单词wordB,我们就称这个值为两个单词之间的距离。比如 pr1ce -> price,只需要将 1 替换为 i 即可,所以两个单词之间的距离为1。pr1ce -> prize,要将 1 替换为 i ,再将 c 替换为 z ,所以两个单词之间的距离为2
求解任意两个单词之间的距离,只要知道之前单词组合的距离即可。我们用dp[i][j]表示第一个字符串wordA[0…i] 和第2个字符串wordB[0…j] 的最短编辑距离,那么这个动态规划的两个重要参数分别是:
- 初始化状态为数组a[][] ={0}
- 状态转移方程:a[i+1][j+1] = max(a[i ][j ], a[i + 1][j], a[i][j + 1]) //最大相同数
#include <iostream> #include <string> #include <algorithm> #include<vector> using namespace std; int wordDistance(string w1, string w2){ int size1 = w1.size(); int size2 = w2.size(); vector<vector<int>> a(size1+1, vector<int>(size2+1)); for (size_t i = 0; i < size1; i++) { for (size_t j = 0; j < size2; j++) { if (w1[i] == w2[j]){ a[i+1][j+1] = a[i][j]+1; } else{ a[i+1][j+1] = max(max(a[i][j + 1], a[i + 1][j]),a[i][j]) ; } } } int size = size2>size1 ? size2 : size1; return (size - a[size1][size2]); } int main() { cout << wordDistance("asdfg", "gfdsaadf")<<endl; }
下面的是两个单词的距离。上面是最大连续相同数。
int WordDistance(string wordA, string wordB){ int sizeA = wordA.size(); int sizeB = wordB.size(); vector<vector<int>>a(sizeA+1,vector<int>(sizeB+1)); for (size_t i = 0; i <= sizeA; i++) { for (size_t j = 0; j <= sizeB; j++) { if (i == 0){ a[i][j] = j; } else if (j == 0){ a[i][j] = i; } else if (wordA[i - 1] == wordB[j - 1]){ a[i][j] = a[i - 1][j - 1]; } else{ a[i][j] = min(min(a[i - 1][j - 1], a[i - 1][j]), a[i][j - 1]) + 1; } } } return a[sizeA][sizeB]; }