ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC127 最长公共子串

2021-03-18 02:32:55  阅读:257  来源: 互联网

标签:子串 str2 str1 maxLen NC127 公共 最长 个字符


题目描述

给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一。 (子串意味着是连续的)

输入

"1AB2345CD","12345EF"

返回值

"2345"

动态规划法

先确定状态,f(i, j)表示str1中前i个字符和str2中前j个字符中的最长公共子序列的长度

但这样写不出状态转移方程,因为这里 求解公共连续字符串 是没法形成递推关系的,因此增加限制条件:

f(i, j)表示str1中前i个字符和str2中前j个字符中的最长公共子序列的长度,且以第i个字符和第j个字符为结尾

可以简单写出状态转移方程

str1[i] == str2[j] 时,f[i][j] = f[i-1][j-1] + 1

str1[i] != str2[j] 时,f[i][j] = 0

但还有个问题,这个动态规划不能直接得到答案,需要用变量maxLength保存最长的长度

边界条件为:

i = 0 或 j = 0 时, f[i][j] = 0

class Solution:
    def LCS(self , str1 , str2 ):
        
        maxLen = 0
        endIndex = 0
        
        f = [[0 for j in range(len(str2)+1)] for i in range(len(str1)+1)]
        
        for i in range(1, len(str1)+1):
            for j in range(1, len(str2)+1):
                if (str1[i-1] == str2[j-1]):
                    f[i][j] = f[i-1][j-1] + 1
                else:
                    f[i][j] = 0
                if maxLen < f[i][j]:
                    maxLen = f[i][j]
                    endIndex = i # end index of the first string
        
        # print(maxLen)
        return str1[endIndex-maxLen:endIndex]

 

此题可以对比  最长公共子序列 一起看

 

参考:

https://www.nowcoder.com/activity/oj

 

标签:子串,str2,str1,maxLen,NC127,公共,最长,个字符
来源: https://www.cnblogs.com/sbj123456789/p/14553149.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有