在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题,但它有一定缺陷,举个例子,看下面的两个字符串

我爱吃小青菜和各种鲜水果。

我很爱吃青菜与各样水果。

上面两个字符串,如果通过计算子串来求相似度,会发现相似度比较低,但如果考虑用最长公共子序列算法求相似度问题,则相似度会很高。子串是有序且连续的,而子序列是有序但不一定连续。

那么,本文就来讲讲如何求两个字符串的最长公共子序列。

一. 暴力解法

跟求最长公共子串一样,也可以用暴力方法来求解最长公共子序列问题,但是复杂度会更高,时间复杂度是指数级别的,很显然,这种方法行不通。

二. 动态规划法

假如两个字符串分别表示为X=[x_0, x_1, ..., x_m-1],Y=[y_0, y_1, ..., y_n-1],通过动态规划法求最长公共子序列,那么用dp[i][j]来表示以x_i和y_j为结尾的最长公共子串的长度,那么

  1. 当x_i=y_j时,dp[i][j] = dp[i - 1][j - 1] + 1
  2. 当x_i≠y_j时,dp[i][j]为dp[i - 1][j]和dp[i][j - 1]中最大的那个

所以得到其状态转移方程如下

代码如下

int LCS(string x, string y) { int xlen = x.size(); int ylen = y.size(); for (int i = 0; i <= xlen; i++) { for (int j = 0; j <= ylen; j++) { if (i == 0 || j == 0) { dp[i][j] = 0; } else if (x[i - 1] == y[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; } else { dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); } } } return dp[xlen][ylen];}

很明显,基于动态规划法的最长公共子序列的时间复杂度为O(mn)。

后面会讲解更多关于求解文本相似度问题的算法,欢迎大家的关注!

两个字符串的最长公共子序列长度_程序员编程算法,解决文本相似度问题的最长公共子序列算法!...相关推荐

  1. 程序员编程艺术第十一章:最长公共子序列(LCS)问题

    程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...

  2. 程序员编程艺术:第二章、字符串是否包含问题

    程序员编程艺术:第二章.字符串是否包含及相关问题扩展 作者:July,yansha. 时间:二零一一年四月二十三日. 致谢:老梦,nossiac,Hession,Oliver,luuillu,雨翔,啊 ...

  3. 程序员编程艺术第三十 三十一章 字符串转换成整数,通配符字符串匹配

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十~ ...

  4. 程序员编程艺术(算法卷):第一章、左旋转字符串

    第一章.左旋转字符串 作者:July,yansha. 时间:二零一一年四月十四日. 说明:(狂想曲,有三层意思:1.思绪纷飞,行文杂乱无章,想到什么,记下什么.2.简单问题深入化,复杂问题精细化,不惧 ...

  5. 程序员编程艺术第三十~三十一章:字符串转换成整数,通配符字符串匹配

    第三十~三十一章:字符串转换成整数,带通配符的字符串匹配 前言 之前本一直想写写神经网络算法和EM算法,但写这两个算法实在需要大段大段的时间,而平时上班,周末则跑去北大教室自习看书(顺便以时间为序,说 ...

  6. 程序员编程艺术:第五章、寻找满足和为定值的两个或多个数

    程序员编程艺术:第五章.寻找和为定值的两个或多个数 作者:July,yansha,zhouzhenren.     致谢:微软100题实现组,编程艺术室.     微博:http://weibo.co ...

  7. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...

    先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...

  8. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  9. 两个字符串的最长公共子序列长度_求2个字符串的最长公共子序列和最长公共子字符串...

    一. 最长公共子序列 定义: 一个数列S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 例如:输入两个字符串BDCABA和 ABCBDA ...

最新文章

  1. 在.net中运用HTMLParser解析网页的原理和方法
  2. 从HTML页面重定向
  3. 沾包 nagle算法等
  4. JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
  5. 11-Memory Management Examples
  6. 石子合并问题java,石子合并问题 GarsiaWachs算法
  7. Address already in use: JVM_Bind问题的解决
  8. 对预检请求的响应未通过访问控制检查
  9. Git:git stash存储文件修改
  10. Jexl表达式引擎-根据字符串动态执行JAVA
  11. 你对NLP的迁移学习爱的有多深?21个问题弄懂最新的NLP进展。
  12. mysql如何给一个数据库所有表都增加一个字段?
  13. 学会理解和更新kali软件源
  14. Redis-使用和原理
  15. Obsidian学习从0到1 —— Dataview
  16. 【Microsoft Azure 的1024种玩法】七十四.五分钟在Azure Virtual Machines中快速部署一套软件项目管理及自动构建工具
  17. 自然增长率,到底怎么算才合理!
  18. 如何升级条码阅读器的译码软件?
  19. 月报总结|Moonbeam5月份大事一览
  20. 海外网红营销:揭秘KOL和KOC的本质区别与市场影响力

热门文章

  1. 链表的基本操作 java_Java_实现单链表-基本操作
  2. 前端为什么说github很重要_私域流量|为什么说私域流量很重要?
  3. linux运行时命令找不到,linux - 在运行Bash脚本时找不到命令,但是在直接运行命令时有效 - 堆栈内存溢出...
  4. 识别产品外观的合格软件_你还在犹豫?外观检测设备使用已成主流!
  5. css两张图片怎么合在一起_web前端入门到实战:纯CSS实现两个球相交的粘粘效果...
  6. php new static,PHP中new self()和new static()的区别用法
  7. centos arm linux gcc,CentOS安装arm-linux-gcc交叉编译器
  8. c mysql 双主复制_mysql双主复制及使用keepalived作高可用的配置详解
  9. win8桌面显示开始菜单教程
  10. vue-cli项目布署问题解决:空白页、静态资源文件404错误、refrenceError:promise未定义(部分浏览器不支持ES6语法)