Python最长公共子串算法实例_python

本文实例讲述了Python最长公共子串算法。分享给大家供大家参考。具体如下:

#!/usr/bin/env python
# find an LCS (Longest Common Subsequence).
# *public domain* 

def find_lcs_len(s1, s2):
 m = [ [ 0 for x in s2 ] for y in s1 ]
 for p1 in range(len(s1)):
  for p2 in range(len(s2)):
   if s1[p1] == s2[p2]:
    if p1 == 0 or p2 == 0:
     m[p1][p2] = 1
    else:
     m[p1][p2] = m[p1-1][p2-1]+1
   elif m[p1-1][p2] < m[p1][p2-1]:
    m[p1][p2] = m[p1][p2-1]
   else:               # m[p1][p2-1] < m[p1-1][p2]
    m[p1][p2] = m[p1-1][p2]
 return m[-1][-1] 

def find_lcs(s1, s2):
 # length table: every element is set to zero.
 m = [ [ 0 for x in s2 ] for y in s1 ]
 # direction table: 1st bit for p1, 2nd bit for p2.
 d = [ [ None for x in s2 ] for y in s1 ]
 # we don't have to care about the boundery check.
 # a negative index always gives an intact zero.
 for p1 in range(len(s1)):
  for p2 in range(len(s2)):
   if s1[p1] == s2[p2]:
    if p1 == 0 or p2 == 0:
     m[p1][p2] = 1
    else:
     m[p1][p2] = m[p1-1][p2-1]+1
    d[p1][p2] = 3          # 11: decr. p1 and p2
   elif m[p1-1][p2] < m[p1][p2-1]:
    m[p1][p2] = m[p1][p2-1]
    d[p1][p2] = 2          # 10: decr. p2 only
   else:               # m[p1][p2-1] < m[p1-1][p2]
    m[p1][p2] = m[p1-1][p2]
    d[p1][p2] = 1          # 01: decr. p1 only
 (p1, p2) = (len(s1)-1, len(s2)-1)
 # now we traverse the table in reverse order.
 s = []
 while 1:
  print p1,p2
  c = d[p1][p2]
  if c == 3: s.append(s1[p1])
  if not ((p1 or p2) and m[p1][p2]): break
  if c & 2: p2 -= 1
  if c & 1: p1 -= 1
 s.reverse()
 return ''.join(s) 

if __name__ == '__main__':
 print find_lcs('abcoisjf','axbaoeijf')
 print find_lcs_len('abcoisjf','axbaoeijf')

希望本文所述对大家的Python程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
, 算法
, 子串
, 最长
公共
id3算法实例python、最长路径算法、最长公共子序列算法、最长前缀匹配算法、有向图最长路径算法,以便于您获取更多的相关知识。

时间: 2024-10-22 16:55:30

Python最长公共子串算法实例_python的相关文章

LCS (Longest Common Subsequence) 字符串最长公共子串算法

LCS (Longest Common Subsequence) 算法用于找出两个字符串最长公共子串. 算法原理: (1) 将两个字符串分别以行和列组成矩阵.(2) 计算每个节点行列字符是否相同,如相同则为 1.(3) 通过找出值为 1 的最长对角线即可得到最长公共子串. 人 民 共 和 时 代中 0, 0, 0, 0, 0, 0华 0, 0, 0, 0, 0, 0人 1, 0, 0, 0, 0, 0民 0, 1, 0, 0, 0, 0共 0, 0, 1, 0, 0, 0和 0, 0, 0, 1

python计数排序和基数排序算法实例_python

一.计数排序 计数排序(Counting sort)是一种稳定的排序算法 算法的步骤如下:找出待排序的数组中最大和最小的元素统计数组中每个值为i的元素出现的次数,存入数组C的第i项对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1当输入的元素是 n 个 0 到 k 之间的整数时,计数排序的时间复杂度为O(N+K),空间复杂度为O(N+K).当K不是很大时,这是一个很有效的线性排序算法. 以下是测试代

【字符串处理算法】获取最长公共子串的算法设计及C代码实现

一.需求描述 输入两个字符串,编写程序获取这两个字符串的第一个最长公共子串. 例如,输入的字符串为"abcdef"和"fecdba",那么这两个字符串的第一个最长公共子串为"cd".   二.算法设计 我们可以首先寻找两个字符串中的第一个相等的字符,然后分别向后移动来比较对应位置的字符是否相等. 即如果字符串1为"1234abcd",字符串2为"abd",那么首先发现字符串1中的第五个字符"a&q

最长连续公共子串算法

#include <iostream> #include <string.h> using namespace std; int GetLCSLength(char* str1, char* str2) { int length1 = strlen(str1); int length2 = strlen(str2); int maxCommonLen = 0; // 公共子串的长度 int endIndex = 0; // 公共子串的最后位置 // 申请内存 int** table

JavaScript自定义函数实现查找两个字符串最长公共子串的方法_javascript技巧

本文实例讲述了JavaScript自定义函数实现查找两个字符串最长公共子串的方法.分享给大家供大家参考,具体如下: //查找两个字符串的最长公共子串 function findSubStr(s1,s2){ var S=sstr= "" ,L1=s1.length,L2=s2.length; if (L1>L2){ var s3=s1;s1=s2,s2=s3,L1=s2.length;} for ( var j=L1;j> 0 ;j--) for ( var i= 0 ;i&

java实现求两个字符串最长公共子串的方法_java

本文实例讲述了java实现求两个字符串最长公共子串的方法.分享给大家供大家参考,具体如下: 这个是华为OJ上的一道题目.首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下: (1)一定不可以有包名: (2)主类名只能为Main: (3)不可以输出与结果无关的信息. 好了,按照以上规则,我们写出来的代码如下(此代码不是最优的,只是用来记录华为OJ上java代码的书写规则): import java.util.Scanner; public cl

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

一.问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列.最长公共子序列(Longest Common Subsequence, LCS),顾名思义,是指在所有的子序列中最长的那一个.子串是要求更严格的一种子序列,要求在母串中连续地出现.在上述例子的中,最长公共子序列为blog(cnblogs, belong),最长公共

深入解析最长公共子串_C 语言

题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串.注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中.请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串.例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串. 分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,

C语言求两个字符串的最长公共子串_C 语言

本文实例讲述了C语言求两个字符串的最长公共子串的方法.分享给大家供大家参考.具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * str3); int stringLength(char * str); void main(){ char str1[50]; char st