最长公共子串

最长公共子串

原题链接:https://www.lintcode.com/problem/79

题目

给出两个字符串,找到最长公共子串,并返回其长度。

子串的字符应该连续的出现在原字符串中,这与子序列有所不同。

样例

样例 1:

输入:

字符串A = "ABCD"
字符串B = "CBCE"

输出:

2

解释:

最长公共子串是 “BC”

样例 2:

输入:

字符串A = "ABCD"
字符串B = "EACB"

输出:

1

解释:

最长公共子串是 ‘A’ 或 ‘C’ 或 ‘B’

挑战

O(n x m) 时间复杂度和空间复杂度

问题分析
1.设计状态

本题与最长公共子序列不同,子串要求要是连续的,而子序列不要求连续

如果已经会了最长公共子序列,那么这道题就比较容易了

首先还是先进行分析,然后设计状态,求A[i]与B[i]之间的公共子串,也分为两种情况

  • A[i] = B[i], 如果当前两个字符串比较的字符相同,那么就转移到他们前一个字符再进行比较
  • A[i] != B[i],如果不相同,那么就不同构成公共子串,所以直接为0

通过分析,就可以设计状态了,还是用最简单的二维表进行比较,dp[i][j] 表示A字符串前i个字符与B字符串前j个字符的公共子串

2. 状态转移方程

{ d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 A [ i ] = B [ j ] d p [ i ] [ j ] = 0 A [ i ] ≠ B [ j ] \begin{cases} dp[i][j] = dp[i - 1][j - 1] + 1 & A[i] = B[j] \\ dp[i][j] = 0 & A[i] \ne B[j] \end{cases} { dp[

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值