python解决最长公共字串问题,一种实现代码


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

       分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。

       完整介绍动态规划将需要很长的篇幅,因此我不打算在此全面讨论动态规划相关的概念,只集中对LCS直接相关内容作讨论。如果对动态规划不是很熟悉,请参考相关算法书比如算法讨论。

'''
Created on 2013-6-28

@author: fpc
'''
import sys

def LCSLength(str1,str2):
    length1=len(str1)
    length2=len(str2)
    c = [[0 for j in range(length2+1)] for i in range(length1+1)]
    b = [[0 for j in range(length2+1)] for i in range(length1+1)]
    for i in range(length1+1):
        c[i][0]=0
    for j in range(length2+1):
        c[0][j]=0;
    for i in range(1,length1+1):
        for j in range(1,length2+1):
            if str1[i-1]==str2[j-1]:
                c[i][j]=c[i-1][j-1]+1
                b[i][j]=0
            elif c[i][j-1]>c[i-1][j]:
                c[i][j]=c[i][j-1]
                b[i][j]=-1
            else:
                c[i][j]=c[i-1][j]
                b[i][j]=1
    length=c[length1][length2]
    return length,b
def PrintSubSequence(str1,b,length1,length2):
    if length1 == 0 or length2 ==0:
        return 
    if b[length1][length2]==0:
        PrintSubSequence(str1,b,length1-1,length2-1)
        sys.stdout.write(str1[length1-1])
    elif b[length1][length2]==1:
        PrintSubSequence(str1,b,length1-1,length2)
    else:
        PrintSubSequence(str1,b,length1,length2-1)
        
str1 = input("please intput the first string:")
str2 = input("please input the second string:")
length1=len(str1)
length2=len(str2)
length,b = LCSLength(str1,str2)
print("the length of the common substring of the two string is:",length)
print("the common substring is :",end=" ")
PrintSubSequence(str1,b,length1,length2)






转载于:https://my.oschina.net/liangxiao/blog/143717

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值