首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最长的公共子串(用直觉表示最长的公共子序列)

最长的公共子串(用直觉表示最长的公共子序列)
EN

Stack Overflow用户
提问于 2019-10-19 08:46:38
回答 1查看 178关注 0票数 0

我一直在努力学习动态编程。我遇到了两个看似相似的问题“最长的公共子序列”“最长的公共子串”

所以我们假设我们有两个字符串str1和str2。

  • For 最长公共子序列,我们以如下方式创建dp表:

代码语言:javascript
复制
if str1[i] != str2[j]:
    dp[i][j] = max(dp[i-1][j], sp[i][j-1])
else:
    dp[i][j] = 1 + dp[i-1][j-1]

遵循同样的直觉,对于“最长的公共子字符串”,我们可以执行以下操作:

代码语言:javascript
复制
if str1[i] != str2[j]:
    dp[i][j] = max(dp[i-1][j], sp[i][j-1])
else:
    if str1[i-1] == str2[j-1]:
        dp[i][j] = 1 + dp[i-1][j-1]
    else:
        dp[i][j] = 1 + dp[i-1][j-1]

检查if str1[i-1] == str2[j-1] 确认我们正在检查子字符串,而不是子序列

EN

回答 1

Stack Overflow用户

发布于 2019-10-30 18:38:55

我不明白您在问什么,但是我将尝试给最长的Common一个很好的解释。

设DPx是最大公共子字符串,考虑STR10.x和str20.y。

考虑到我们正在计算DPa,我们总是有可能不使用这个字符= max( DPa,DPa -1),如果str1a == str2b,我们也可以接受DPa -1 +1的答案(因为我们找到了一个新的匹配字符)。

代码语言:javascript
复制
// This does not depend on s[i] == s[j]
dp[i][j] = max( dp[i][j - 1], dp[i - 1][j] )

if str1[i] == str2[j]:
    dp[i][j] = max( dp[i][j], dp[i - 1][j - 1] + 1 )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58461970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档