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 #### 长度与定义 **最长公共子串(Longest Common Substring, LCS)**是两个或多个字符串中的最长字符串,该字符串同时也是这些字符串的子串。这里需要注意区分子串与子序列的概念...
在编程领域,最长公共子串(Longest Common Substring,LCS)问题是一个经典的问题,主要涉及字符串处理和算法设计。在这个案例中,我们关注的是一个由C#实现的自创算法来解决这个问题。下面将详细讲解这个算法的...
如果两个字符串的首字符不相等,则用三种对齐策略分别计算可能的最长公共子串,然后取最长的一个与当前已知的最长公共子串比较,如果比当前已知的最长公共子串长就用计算出的最长公共子串代替当前已知的最长公共子串...
总结一下,Python中最长公共子串算法主要依赖于动态规划,通过构建矩阵存储子串长度,并使用方向矩阵回溯找到实际的最长公共子串。这种方法高效且易于理解,是解决此类问题的经典方法。在实际编程中,这个算法可以...
总之,"Go-go-lcssGo"项目为Go开发者提供了一个高效的最长公共子串算法实现,利用Go语言的优势,提升了算法执行效率,使得在处理大数据量的字符串比较时更加得心应手。通过学习和理解这个项目,开发者不仅可以掌握...
c源码编写的求两个字符串的最长公共子串,采用递归算法
最长公共子串(Longest Common Substring,LCS)是一个在计算机科学中常见的字符串处理问题,它涉及到查找两个或多个字符串中的最长连续子序列,这个子序列同时存在于所有字符串中。MFC,全称为Microsoft Foundation...
LCS(longest common substring)算法,即最大公共子串,它是求两个字符串最长公共子串的问题。大体解法是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长...
而LCS则不同,它不要求连续性,所以 "AE" 也是 "ABCDEF" 和 "ABEFGH" 的一个最长公共子序列,尽管它不是公共子串。 接下来,我们将从算法的角度探讨如何求解LCS。一种常见的方法是使用动态规划,这在计算机科学中是...
在编程领域,最长公共子串(Longest Common Substring,LCS)问题是一个经典的问题,它寻找两个或多个字符串中的最长连续子序列,这个子序列同时存在于所有字符串中。在这个问题中,我们专注于PHP如何解决两个字符串...
最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,涉及序列比较和算法设计。在本实验报告中,我们将深入探讨如何利用动态规划方法解决这一问题。 首先,LCS问题旨在找到两个给定序列...
一、问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子...在上述例子的中,最长公共子序列为blog(cnblogs, belong),最长公共子串为lo(cnblogs, belong)。 二、求解算法 对于母串X=<x1,x2,⋯,xm
最长公共子串是指在两个或多个序列中找到最长的连续子串,而LCS问题是指在两个或多个序列中找到最长的公共子序列。 TWO concepts are often confused with each other, but they are indeed different. 此外,LCS...
最长公共子串(LCS)问题是一直使用的经典计算问题。 该项目探索 LCS,它的一个特例,最长回文子串 (LPS) 问题,以及它的概括以及不同的问题域如何影响算法性能。 我对这些问题实施了各种解决方案,讨论了它们的理论...
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出一个最长公共子串。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串, 下面的算法是根据网上的java算法由酒逍遥 ...
LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置...
题目:如果字符串一的所有字符按其在字符串...分析:求最长公共子序列(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。 完整介绍动态规划将