最长公共子串
题目
给出两个字符串,找到最长公共子串,并返回其长度。
子串的字符应该连续的出现在原字符串中,这与子序列有所不同。
样例
样例 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[</