`
dqifa
  • 浏览: 115936 次
社区版块
存档分类
最新评论

求最长非连续公共子串算法LCS

阅读更多

python 求最长非连续公共子串算法LCS

动态规划求最长非连续公共子串算法LCS
参照算法网址:http://blog.chinaunix.net/u1/35100/showart_415862.html
入口: 两个 要比较的串 S1,S2
返回 : 最长非连续公共子串 S

#coding=gbk
#
class TEMT:
      L,IX1,IX2 =0,0,0

def WLCS( s1,s2 ):
    n1 = len( s1 )
    n2 = len( s2 )
    if n1==0 or n2==0:
        return ""
    MM = [ [ TEMT() for j in range(0,n2 ) ] for I in range(0,n1 ) ]
    if s1[0] == s2[0]:
        MM[0][0].L   = 1
        MM[0][0].IX1 = 0 
        MM[0][0].IX2 = 0
    else:
        MM[0][0].L   = 0
        MM[0][0].IX1 = 0 
        MM[0][0].IX2 = 0
    for I in range(1,n1 ):
        MM[I][0].L   = MM[I-1][0].L
        MM[I][0].IX1 = MM[I-1][0].IX1
        MM[I][0].IX2 = 0
        if s2[0] == s1[I]:
            MM[I][0].L = 1
            if MM[I-1][0].L == 0 :
                MM[I][0].IX1 = I
    for I in range(1,n2 ):
        MM[0][I].L   = MM[0][I-1].L 
        MM[0][I].IX2 = MM[0][I-1].IX2
        MM[0][I].IX1 = 0
        if s2[I] == s1[0]:
            MM[0][I].L = 1
            if MM[0][I-1].L == 0 :
                MM[0][I].IX2 = I

   
    for I in range(1,n1): 
        for J in range(1,n2): 
          if s1[I] ==s2[J] :
            MM[I][J].L    = MM[I-1][J-1].L + 1;
            MM[I][J].IX1 = I;
            MM[I][J].IX2 = J;
          elif (MM[I-1][J].L>MM[I][J-1].L):
            MM[I][J].L    = MM[I-1][J].L;
            MM[I][J].IX1 = MM[I-1][J].IX1;
            MM[I][J].IX2 = MM[I-1][J].IX2;
          else:
            MM[I][J].L    = MM[I][J-1].L;
            MM[I][J].IX1 = MM[I][J-1].IX1;
            MM[I][J].IX2 = MM[I][J-1].IX2;
    I = n1-1; J = n2-1 
    LP = MM[I][J].L;
    if LP==0:
         return ""
    S = [ "0" ] * LP
    K = LP 
    while (I>=0) and (J>=0) :
        LP = MM[I][J].L;
        if LP>0 :
          if s1[I]==s2[J]:
              K = K -1
              S[K] = s1[I];
              I =I-1; J = J-1;
          else:
              K1 = MM[I][J].IX1;
              K2 = MM[I][J].IX2;
              I =K1; J =K2;
        else :
            
            break;
    return "".join(S)

s1 ='abcdabd';
s2 ='b666cjabkkkd';    
print( WLCS(s1,s2) )

 

-- 结果 ---

bcabd

 

from:http://hi.baidu.com/jxq61/item/644aaf0d903b84e0f55ba68f

分享到:
评论

相关推荐

    动态规划:最长公共子串 LCS

    ### 动态规划:最长公共子串 LCS #### 长度与定义 **最长公共子串(Longest Common Substring, LCS)**是两个或多个字符串中的最长字符串,该字符串同时也是这些字符串的子串。这里需要注意区分子串与子序列的概念...

    C#最长公共子串(连续)算法(自创)

    在编程领域,最长公共子串(Longest Common Substring,LCS)问题是一个经典的问题,主要涉及字符串处理和算法设计。在这个案例中,我们关注的是一个由C#实现的自创算法来解决这个问题。下面将详细讲解这个算法的...

    算法系列之六:最长公共子序列(LCS)问题(连续子序列)的三种解法.doc

    如果两个字符串的首字符不相等,则用三种对齐策略分别计算可能的最长公共子串,然后取最长的一个与当前已知的最长公共子串比较,如果比当前已知的最长公共子串长就用计算出的最长公共子串代替当前已知的最长公共子串...

    Python最长公共子串算法实例

    总结一下,Python中最长公共子串算法主要依赖于动态规划,通过构建矩阵存储子串长度,并使用方向矩阵回溯找到实际的最长公共子串。这种方法高效且易于理解,是解决此类问题的经典方法。在实际编程中,这个算法可以...

    Go-go-lcssGo中的最快公共子串算法

    总之,"Go-go-lcssGo"项目为Go开发者提供了一个高效的最长公共子串算法实现,利用Go语言的优势,提升了算法执行效率,使得在处理大数据量的字符串比较时更加得心应手。通过学习和理解这个项目,开发者不仅可以掌握...

    LCS最长公共子串

    c源码编写的求两个字符串的最长公共子串,采用递归算法

    最长公共子串MFC实现

    最长公共子串(Longest Common Substring,LCS)是一个在计算机科学中常见的字符串处理问题,它涉及到查找两个或多个字符串中的最长连续子序列,这个子序列同时存在于所有字符串中。MFC,全称为Microsoft Foundation...

    LCS(longest common substring)算法,即最大公共子串 C实现

    LCS(longest common substring)算法,即最大公共子串,它是求两个字符串最长公共子串的问题。大体解法是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长...

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

    而LCS则不同,它不要求连续性,所以 "AE" 也是 "ABCDEF" 和 "ABEFGH" 的一个最长公共子序列,尽管它不是公共子串。 接下来,我们将从算法的角度探讨如何求解LCS。一种常见的方法是使用动态规划,这在计算机科学中是...

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

    在编程领域,最长公共子串(Longest Common Substring,LCS)问题是一个经典的问题,它寻找两个或多个字符串中的最长连续子序列,这个子序列同时存在于所有字符串中。在这个问题中,我们专注于PHP如何解决两个字符串...

    最长公共子序列实验报告

    最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,涉及序列比较和算法设计。在本实验报告中,我们将深入探讨如何利用动态规划方法解决这一问题。 首先,LCS问题旨在找到两个给定序列...

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

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

    lcs算法详解.pdf

    最长公共子串是指在两个或多个序列中找到最长的连续子串,而LCS问题是指在两个或多个序列中找到最长的公共子序列。 TWO concepts are often confused with each other, but they are indeed different. 此外,LCS...

    java笔试题回文子串-LPS-LCS-Algorithm-Analysis:最长公共子串的实现及相关问题

    最长公共子串(LCS)问题是一直使用的经典计算问题。 该项目探索 LCS,它的一个特例,最长回文子串 (LPS) 问题,以及它的概括以及不同的问题域如何影响算法性能。 我对这些问题实施了各种解决方案,讨论了它们的理论...

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

    请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出一个最长公共子串。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串, 下面的算法是根据网上的java算法由酒逍遥 ...

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

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

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

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

Global site tag (gtag.js) - Google Analytics