编程之美3.3 计算两个字符串的相似度
假如有两个字符串分别是:abcd,bbcd,那么,这两个字符串不相同的字符个数是1,即第一个字符时不相同的,定义字符串的相似度为 1 / (x + 1),其中,x 就是不相同的字符个数。
我们可以有三种方法比较两个字符串中不相同字符的个数:
1.去掉第一个字符串中不相同的那个字符,并同时再去比较下一个字符
2.去掉第二个字符串中不相同的那个字符,并同时再去比较下一个字符
3.同时去掉字符串中不相同的那个字符,并同时再去比较下一个字符
之后,我们需要把不相同的字符个数加 1 ,最后,我们只需要取得三种方法中值最小的那个即可。
很容易发现,依次比较字符是否相同时时递归的操作,所以,这道题目解法如下:
函数声明:
/*3.3 计算两个字符串的相似度*/
int DutCalculateStringDistance(std :: string&, std :: string&);
int DutCalculateStringDistance(std :: string&, int, int, std :: string&, int, int);
源代码:
int DutCalculateStringDistance(string& s1, int begin1, int end1, string& s2, int begin2, int end2)
{if (begin1 > end1){if (begin2 > end2)return 0;elsereturn end2 - begin2 + 1;}if (begin2 > end2){if (begin1 > end1)return 0;elsereturn end1 - begin1 + 1;}if (s1[begin1] == s2[begin2])return DutCalculateStringDistance(s1, begin1 + 1, end1, s2, begin2 + 1, end2);else{/*计算各个不同办法的相似度*/int t1 = DutCalculateStringDistance(s1, begin1 + 1, end1, s2, begin2, end2);int t2 = DutCalculateStringDistance(s1, begin1, end1, s2, begin2 + 1, end2);int t3 = DutCalculateStringDistance(s1, begin1 + 1, end1, s2, begin2 + 1, end2);/*取一个最小的相似度*/return DutMin<int>(t1, t2, t3) + 1;}
}int DutCalculateStringDistance(string& s1, string& s2)
{return DutCalculateStringDistance(s1, 0, (int)s1.length() - 1, s2, 0, (int)s2.length() - 1);
}
代码中用到的模板函数:
template <typename T>
T DutMin(T data1, T data2)
{return data1 < data2 ? data1 : data2;
}
template <typename T>
T DutMin(T data1, T data2, T data3)
{return DutMin<T>(DutMin<T>(data1, data2), data3);
}
编程之美3.3 计算两个字符串的相似度相关推荐
- java数组相似度_Java 计算两个字符串的相似度
问题 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程度.我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a&qu ...
- 编程之美:编程判断两个链表是否相交
1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...
- Python计算两个字符串的相似度代码示例
import difflibs1="饭其家·特色盖浇饭金沙国际店" s2="饭其家·特色盖饭金沙国际店" def get_equal_rate(str1, st ...
- similartext php,使用PHPsimilartext计算两个字符串相似度,similartext_PHP教程
使用PHP similar text计算两个字符串相似度,similartext 在网站开发中,我们经常使用php similar text 计算两个字符串相似度; 1,similar_text的用法 ...
- 编程之美2.10:寻找数组中的最大值和最小值
编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...
- 编程之美2.1 求二进制中1的个数
最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...
- 2017“编程之美”终章:AI之战勇者为王
编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...
- Java 并发编程之美:并发编程高级篇之一-chat
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
- Java 并发编程之美:并发编程高级篇之一
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
最新文章
- centeros7网络服务无法启动_Linux网络服务02——DHCP原理与配置
- 贪心 双指针----Codeforces Round #727 (Div.2) D. PriceFixed
- 中国钢筋加工设备运营现状与未来前景规划报告2022-2028年版
- find命令的技巧和一些例子
- background-position 用法介绍
- linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
- 用Python强制子类重写父类,如此简单就能做到
- Mysql--Auto_increment详解
- AngularJS Documents 官方英文文档
- OPENROWSET访问CSV格式文件
- 数电笔记之逻辑函数卡诺图化简
- C# 解析种子文件(bt文件)
- Git取消add 、 commit、push的命令
- 获取空气质量站点数据 城市数据 日数据 时数据
- Unity 的阴影实现原理
- 主流射频半导体材料及特性介绍
- 使用Docker搭建自己的在线密码管理器软件-Bitwarden
- 福昕阅读器中,如何令两个pdf文件分别在两个不同的窗口显示?
- 如何使用LODOP实现合同套打精准打印?
- 手机忘记密码解锁的 6 大软件方法
热门文章
- Spring Mybatis实例SqlSessionDaoSupport混用xml配置和注解
- jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................
- [开发工具]借助dillinger.io,在博客园写markdown
- linux下环境变量PS1设置
- 让Exchange 2010 (2007适用)可以收发外部邮件
- 部队人员官兵请假管理系统
- 读javascript高级程序设计10-DOM
- 2017-09-27 前端日报
- SSH分客户端openssh-client和openssh-server
- iOS swift lazy loading