文档管理中心
我的

【python成长之路】最长字符公共子串

目的:求2个字符串的最长字符公共子串
代码:
def findMaxSubSeq(self, str1, str2):
    if any([not str1, not str2]):
        return None
    len1 = len(str1)
    len2 = len(str2)
    list = [[0 for i in range(len2 + 1)] for j in range(len1 + 1)]
    maxnum = 0
    p = 0
    for i in range(len1):
        for j in range(len2):
            if str1[i] == str2[j]:
                list[i + 1][j + 1] = list[i][j] + 1
            if list[i + 1][j + 1] > maxnum:
                maxnum = list[i + 1][j + 1]
                p = i + 1
    if maxnum == 0:
        return ''
    else:
        print(str1[p - maxnum:p])
        return str1[p - maxnum:p]


【知识点】

1、为什么字符串相同时,用了list[i + 1][j + 1] = list[i][j] + 1,而不是list[i][j] =1?

如果用list[i][j] =1的方式,结果如下图所示,求公共子串的长度时,需要将对角线上的值进行相加。因此为了优化处理,直接在list[i + 1][j + 1]进行赋值。


2、为什么创建二维数组时,用的是list = [[0 for i in range(len2 + 1)] for j in range(len1 + 1)],而不是list = [[0 for i in range(len1 + 1)] for j in range(len2 + 1)]?

因为如果采用后面的list生成方式,行列是len2,列数是len1。当2个字符串长度不一致时,会出现列表长度异常的情况。

如果不理解,可以看下面的代码:


a [[i ()] j ()]
a[][] (a)


结果是:

Traceback (most recent call last):
File 'E:/OJ/TestPython/src/huawei/test.py', line 2, in <module>
a[2][3] = 1
IndexError: list assignment index out of range

报了列表超过长度了?为什么呢?实际我们想取的是第3行第4列的数值,但是我们定义的列表是3列4行,所以就报错了。


3、any([a,b]) :只要有一个是True,就会返回True;all([a,b])必须全部是true,才会返回true


点赞
收藏
回复
分享
举报
浏览812 发布于2019-07-17 02:55未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。