C++动态规划算法之计算字符串距离
来源:互联网 发布:python 函数作为参数 编辑:程序博客网 时间:2024/05/21 09:46
计算字符串距离
Description
- 对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:
- 修改一个字符(如把“a”替换为“b”)
- 删除一个字符(如把“traveling”变为“travelng”)
- 增加一个字符(如把“son”改成“song”)
给定任意两个字符串,写出一个算法来计算出他们的距离。
Input
- 第一行有一个整数n。表示测试数据的组数,
接下来共n行,每行两个字符串,用空格隔开。表示要计算距离的两个字符串
字符串长度不超过1000。
Output
- 针对每一组测试数据输出一个整数,值为两个字符串的距离。
Sample Input
3abcdefg abcdefab abmnklj jlknm
Sample Output
104
题目解析
这道题的要求就是求最短编辑距离,所谓编辑距离(简称ED),是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数(编辑操作有三种:将一个字符替换成另一个字符、插入一个字符、删除一个字符)。它的公式如下:
if(a[i-1]==b[j-1])
f[i][j]=f[i-1][j-1];
else
f[i][j]=1+min(f[i-1][j-1],f[i][j-1],f[i-1][j]);接下来,为了使大家更清楚最短编辑距离,我制作了3个表(样例中的3组数据),具体如下:
0 a b c d e f 0 0123
456a 1012345b 2101234c 3210123d 4321012e 5432101f 6543210g 76543210 a b 0 012a 101b 2100 j l k n m 0 012345m 112344n 222334k 333234l 443334j 544444
代码实现
代码(DP)如下:
#include<cstdio>#include<cstring>#include<iostream>using namespace std;char a[1001],b[1001];int lena,lenb,f[1001][1001];int min(int x,int y,int z) //algorithm库的min只有两个参数(即只能对两个数进行判定),所以我自己写了一个min函数{if(x<=y&&x<=z) return x;else if(y<=x&&y<=z) return y;else return z;}main(){int n;cin>>n; //输入测试数据数while(n--){scanf("%s%s",a,b); //本人不才,不太会用string,所以用了字符数组(用string也可以)lena=strlen(a); //存储a字符数组的长度lenb=strlen(b); //存储b字符数组的长度for(int i=0;i<=lena;i++)for(int j=0;j<=lenb;j++){if(!i) //给第一列赋值{ f[i][j]=j; continue; } if(!j) //给第一行赋值{ f[i][j]=i; continue; } /*这里就是最短编辑距离的公式*/if(a[i-1]==b[j-1]) //若两子串的最后一个字符相等,那它们的最短编辑距离就跟删掉最后一个字符后的最短编辑距离相等f[i][j]=f[i-1][j-1];else //在替换、插入、删除中选择令两个字符串编辑距离最少的,并加上1(当末尾字符不相等时)f[i][j]=1+min(f[i-1][j-1],f[i][j-1],f[i-1][j]);}cout<<f[lena][lenb]<<endl;}}
阅读全文
0 1
- C++动态规划算法之计算字符串距离
- 动态规划-计算字符串距离
- 动态规划--计算字符串距离
- 动态规划:计算字符串距离
- 2988:计算字符串距离(2.6基本算法之动态规划)
- |NOIOJ|动态规划|2988:计算字符串距离
- 计算机算法--动态规划计算编辑距离
- 动态规划入门之求字符串距离
- 【动态规划】字符串编辑距离(Levenshtein距离)算法
- 编辑距离之动态规划算法
- Edit Distance 计算两个字符串的变化距离 动态规划
- 算法:求两个字符串的levenshtein距离,动态规划。
- 动态规划 字符串编辑距离
- 《动态规划》之--字符串比较问题(扩展距离)
- 【动态规划】之字符串编辑距离(难度:2星)
- 动态规划之编辑距离
- 动态规划之编辑距离
- 动态规划之编辑距离
- js实现一个图片懒加载插件
- Windows 10快速在指定目录打开命令行
- Java知识:恒生电子的坑爹笔试题扩展的知识
- 分组(根据某一列的值处理成表格)
- 牛客网 二维数组中的查找python实现
- C++动态规划算法之计算字符串距离
- 银联支付jboss 环境下报异常JCE cannot authenticate the provider BC的解决方法
- iptables详解
- Java与js完成des+3des加密 、解密
- 使用@property
- 最新微信开通状态过滤程序
- 刷题记录-luoguP1113 杂务
- win10 CentOS7 UEFI+GPT 双系统安装
- 虚拟机双网卡配置以及注意事项