假如有两个字符串分别是: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 计算两个字符串的相似度相关推荐

  1. java数组相似度_Java 计算两个字符串的相似度

    问题 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程度.我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a&qu ...

  2. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  3. Python计算两个字符串的相似度代码示例

    import difflibs1="饭其家·特色盖浇饭金沙国际店" s2="饭其家·特色盖饭金沙国际店" def get_equal_rate(str1, st ...

  4. similartext php,使用PHPsimilartext计算两个字符串相似度,similartext_PHP教程

    使用PHP similar text计算两个字符串相似度,similartext 在网站开发中,我们经常使用php similar text 计算两个字符串相似度; 1,similar_text的用法 ...

  5. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  6. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  7. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  8. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  9. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

最新文章

  1. centeros7网络服务无法启动_Linux网络服务02——DHCP原理与配置
  2. 贪心 双指针----Codeforces Round #727 (Div.2) D. PriceFixed
  3. 中国钢筋加工设备运营现状与未来前景规划报告2022-2028年版
  4. find命令的技巧和一些例子
  5. background-position 用法介绍
  6. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
  7. 用Python强制子类重写父类,如此简单就能做到
  8. Mysql--Auto_increment详解
  9. AngularJS Documents 官方英文文档
  10. OPENROWSET访问CSV格式文件
  11. 数电笔记之逻辑函数卡诺图化简
  12. C# 解析种子文件(bt文件)
  13. Git取消add 、 commit、push的命令
  14. 获取空气质量站点数据 城市数据 日数据 时数据
  15. Unity 的阴影实现原理
  16. 主流射频半导体材料及特性介绍
  17. 使用Docker搭建自己的在线密码管理器软件-Bitwarden
  18. 福昕阅读器中,如何令两个pdf文件分别在两个不同的窗口显示?
  19. 如何使用LODOP实现合同套打精准打印?
  20. 手机忘记密码解锁的 6 大软件方法

热门文章

  1. Spring Mybatis实例SqlSessionDaoSupport混用xml配置和注解
  2. jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................
  3. [开发工具]借助dillinger.io,在博客园写markdown
  4. linux下环境变量PS1设置
  5. 让Exchange 2010 (2007适用)可以收发外部邮件
  6. 部队人员官兵请假管理系统
  7. 读javascript高级程序设计10-DOM
  8. 2017-09-27 前端日报
  9. SSH分客户端openssh-client和openssh-server
  10. iOS swift lazy loading