`
shuimuya
  • 浏览: 47813 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

动态规划求解最长公共子串中的问题

 
阅读更多

    今天学习了动态规划的相关思想,随后找了一些经典的题目希望能加深一下印象。然而在求解“最长公共子串”的问题时却发现了一些问题。

    一般来说,在求解这类问题的时候,大都依据以下原理:

    定义lcs[i][j]为序列“a0,a1,…,ai-2”和“b0,b1,…,bj-1”的最长公共子序列的长度,计算lcs[i]     [j]可递归地表述如下:

    (1)lcs[i][j] = 0                         如果i=0或j=0;
    (2)lcs[i][j] = lcs[i-1][j-1]+1             如果i,j>0,且a[i-1] = b[j-1];
    (3)lcs[i][j] = max{
lcs[i][j-1], lcs[i-1][j]} 如果i,j>0,且a[i-1] != b[j-1]。

      依据以上公式写出程序以后,在测试时发现对于输入串“ABCDDAB”和“BCDAB”所求得的最长公共子串为“BCDAB”,长度为5。但是我们可以很容易看出最长公共子串的长度应该为3,为“BCD”或“DAB”。经过检查代码,发现问题还是出在上述的状态转移公式中。当a[i-1] = b[j-1]lcs[i][j] = lcs[i-1][j-1]+1并不一定成立因为lcs[i-1][j-1]的公共子串中并不一定包含a[i-1]和b[j-1]。例如对于上述输入串,a[6-1]=b[4-1],但是lcs[6][4]=3!=lcs[5][3]+1。

      目前找到网上的大部分求解方法都是基于上述公式,为什么会出现这么大的漏洞。难道是我理解错了?

 

 

     经过进一步的研究,发现我对于最长公共子串的理解有偏差。下面的内容引自:http://hxraid.iteye.com/blog/622462

     LCS:又称 最长公共子序列。 其中子序列(subsequence)的概念不同于串的子串。它是一个不一定连续 但按顺序取自字符串X中的字符序列。 例如:串"AAAG"就是串“CGATAATTGAGA”的一个子序列。

    字符串的相似性问题可以通过求解两个串间的最长公共子序列(LCS)来得到。

 

    对于最长公共子串问题的解法,参见http://space.itpub.net/16857/viewspace-79033

 

 

分享到:
评论

相关推荐

    用动态规划思想求解最长公共子串

    若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有...给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列

    最长公共子串的求解问题

    最长公共子串求解,有需要的可以下来参考……

    求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列

    求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列. http://blog.csdn.net/ssuchange/article/details/17341693

    PHP实现求解最长公共子串问题的方法

    主要介绍了PHP实现求解最长公共子串问题的方法,简单描述了求解最长公共子串问题算法原理,并结合实例形式分析了PHP实现求解最长公共子串的具体操作技巧,需要的朋友可以参考下

    详解Python最长公共子串和最长公共子序列的实现

    LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置...

    利用C++实现最长公共子序列与最长公共子串

    一、问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子...在上述例子的中,最长公共子序列为blog(cnblogs, belong),最长公共子串为lo(cnblogs, belong)。 二、求解算法 对于母串X=<x1,x2,⋯,xm

    最长公共子序列及杭电1394的求解

    最长公共子序列及杭电1394的求解 求解字符串公共子串的问题

    从“公共子串”的角度来分析求解“最长公共子序列”(LCS)

    从“公共子串”的角度来分析求解“最长公共子序列”(LCS)

    PHP实现求两个字符串最长公共子串的方法示例

    前面一篇PHP实现求解最长公共子串问题的方法是基于java改进而来,这里再来看另一种公共子串算法。 代码如下: <?php $a = 'abceee12345309878'; $b = 'abceeew2345i09878fsfsfsfabceeewsfsdfsfsabceeew'; $c = ...

    C语言求解最长公共子字符串问题及相关的算法分析

    题目:如果字符串一的所有字符按其在字符串...分析:求最长公共子序列(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。 完整介绍动态规划将

    构成回文序列最少要增加多少字符

    构成回文序列最少要增加多少字符 ...解法二为求出字符串与逆序字符串的最长公共子串, 需要增加数目为字符串总数减去最长公共子串长度。 http://blog.csdn.net/ssuchange/article/details/17385039

    最大公共子序列的c++实现

    问题描述 ...给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA

    leetcode中国-day-day-up:记录每天的学习

    动态规划求解最长回文子串 3 hmm 前向计算法,结合hanlp博客与李航的统计学一起看的 9月19日 1 句法依存分析以及语法树 2 leetcode双指针盛最多水问题 3 hmm 维特比算法 4 jupyter notebook 写文档 9月20日 1 ...

    数据结构课程设计

    最长公共子串,英文文章统计,本科生导师制问题,镜像树,堆栈应用,矩阵位置旋转,集合运算,保龄球计分,车位管理,学生成绩管理系统,英文单词填空游戏,城市管理,数字图像处理,三子棋游戏,模拟人工洗牌,英文...

    我用Python写的一些算法

    使用动态规划的两种方式实现的LCS(最大公共串)(下面的算法都会使用动态规划的两种方式来实现) 加权有向无环图中最短路径和最长路径 背包问题 最长回文子串(lps) ###幂乘:算法复杂度是O(lgn) ##贪心算法 活动...

    编辑距离(LD)算法

    编辑距离(LD)算法在求解两个字符串的相似问题时只考虑了编辑操作次数,未考虑字符串之间的公共子串对相似度的影 响。...在计算编辑距离时,以原有矩阵求出两字符串的最长公共子串及所有LD 回溯路径

    基于改进编辑距离的字符串相似度求解算法 (2014年)

    在计算编辑距离时,以原有矩阵求出两字符串的最长公共子串及所有LD回溯路径。选取一个单词作为源串,一组与源串不同程度相似的单词为目标串,将改进的相似度度量公式与现有的字符串相似度计算方法进行比较,改进公式...

    全面的算法代码库

    使用后缀数组求解最长公共子串 Longest-Common-Substring 最长上升子序列(n·log(n)) Longest-Increasing-Subsequence(n·log(n)) 倍增法求最近公共祖先 Lowest-Common-Ancestor(Doubling) 朴素的矩阵乘法 ...

    leetcode2sumc-solutions:LeetCode及PythonTips部分题目求解

    leetcode 2 和 c 解决方案 LeetCode 以及 pythonTips 上的题解 LeetCode主页:....计算二进制子串 ...无重复字符的最长子串 ...两个有序数组的中位数 ...最长公共前缀 简单的 8 毫秒/98.86% 64 最小路径和 中等的 5ms/44.1

Global site tag (gtag.js) - Google Analytics