题解 | #公共子串计算#

公共子串计算

https://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b

两种方法选其一,暴力法可以倒序遍历,找到公共子串即可break减少循环次数,动态规划注意第一个值相等时的处理

# fun是暴力法,fun_dp是动态规划,选其一都行
def fun():
    s1, s2 = input(), input()
    max_com_sub_s = ""
    s1, s2 = (s1, s2) if len(s1) < len(s2) else (s2, s1)  # s1是短的
    for i in range(len(s1)):  # 遍历短的
        for j in range(len(s1), i, -1):  # 从末尾开始遍历,有子串时即可退出
            if s1[i:j] in s2 and len(s1[i:j]) > len(max_com_sub_s):  # 找到子串并且长度更大
                max_com_sub_s = s1[i:j]  # 替换最大子串
                break
    print(len(max_com_sub_s))


def fun_dp():
    s1, s2 = input(), input()
    s1, s2 = (s1, s2) if len(s1) < len(s2) else (s2, s1)  # s1是短的
    dp = [[0 for _ in s2] for _ in s1]  # s1的i位和s2的j位时的最大公共子串长度
    max_len, max_com_sub_s = 0, ""
    for i in range(0, len(s1)):  # 遍历s1的每个位置
        for j in range(0, len(s2)):  # 遍历s2的每个位置
            if s1[i] == s2[j]:  # 当前位置相等时,
                if i == 0 or j == 0:  # 如果是开头,那自然是1
                    dp[i][j] = 1
                else:  # 动态转移方程为s1 s2上一位的dp值+1
                    dp[i][j] = dp[i - 1][j - 1] + 1
                if dp[i][j] > max_len:  # 更新最大值,因为最大值不是dp[-1][-1]
                    max_len = dp[i][j]
                    max_com_sub_s = s2[j - max_len + 1 : j + 1]
    print(len(max_com_sub_s))


fun()

全部评论

相关推荐

zYvv:双一流加大加粗再标红,然后广投。主要是获奖荣誉不够,建议开始不用追求大厂,去别的厂子刷下实习。
点赞 评论 收藏
分享
牛客38347925...:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务