码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划

时间:2016-09-02 23:17:30      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

计算出最接近的单词

通过最小的改动,使2个单词相同。

 

  1. 从第一个单词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;
}

 

动态规划

标签:

原文地址:http://www.cnblogs.com/yuguangyuan/p/5835866.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!