题目描述
我们有两个字符串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 |