动态规划
Posted 于光远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划相关的知识,希望对你有一定的参考价值。
计算出最接近的单词
通过最小的改动,使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; }
以上是关于动态规划的主要内容,如果未能解决你的问题,请参考以下文章