题目描述
我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符不一定在原字符串中连续。
例如字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。此外,“ab”、“af”等都是它们的字串。
现在给你两个任意字符串(不包含空格),请帮忙计算它们的最长公共子序列的长度。
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.
输出描述:
输出为一个整数,表示最长公共连续子串的长度。
示例1
输入
abcde
abgde
输出
2
思路
- 常规解法:假设有两个字符串A(长度5),字符串B(长度3),因为B的长度为3,那么最长的公共连续子串的长度最大的情况也只可能是3,所以可以从最短长度那个字符串开始递推,字符串B中,列举长度为3的连续子串,长度为2的连续子串,长度为1的连续子串。从3开始,在字符串A中找是否包含B中长度为3的子串,如果包含,那么就可以终止,结果那就是3,不需要再找长度为2的子串,如果不包含,再找长度为2的子串。。。直到长度为0 ,终止查找。
- 动态规划解法:有状态转移方程:dp[i][j]=dp[i-1][j-1]+1;
实例:A:acdf;B:adfa
| 0 | a | c | d | f |
|---|---|---|---|---|
| a | 1 | 0 | 0 | 0 |
| d | 0 | 0 | 1 | 0 |
| f | 0 | 0 | 0 | 1 |
| a | 1 | 0 | 0 | 0 |
对角线累加
| 0 | a | c | d | f |
|---|---|---|---|---|
| a | 1 | 0 | 0 | 0 |
| d | 0 | 0 | 1 | 0 |

该博客讨论了如何在Java中找到两个字符串的最长公共连续子串。它介绍了问题描述,输入输出格式,并提供了使用动态规划的解决方案。通过动态规划状态转移方程dp[i][j]=dp[i-1][j-1]+1来求解,以找到最长公共子串的长度。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



