思路:后缀是指要解决的子问题是原问题的后半部分,如果用字符串类描述,相当于子问题永远都是原问题的后半部分 str[i:]
str[i:] 表示从下标i开始,一直到末尾的整个字符串
示例
最长公共子序列长度
给定两个字符串A:
HIEROGLYPHOLOGY
和字符串B:
MICHAELANGELO
,他们最长公共的子序列为
H I E ROG L YPHO LO GY <--> MIC H A EL ANGE LO
可以得到最长公共子序列长度为5。分析如下:
- A、B两个字符串,如果字符串A的第一个字符和B的第一个字符一模一样,那这个字符一定是属于最长子序列的一个,剩余部分为A[1:]和B[1:],且最终结果就是在前一个结果的基础上加上剩余部分最长字串长度即可
- A、B两个字符串,如果第一个字符不一样,最长公共子序列要么包含A中的第一个字符、要么包含B中的第一个字符、或者是两个都不是。即最长公共字串要么你是 A[1:]和B[0:],要么是A[0:]和B[1:],所以最长公共字串就是 A[1:]和B[0:],A[0:]和B[1:]之间的最大值
最终要计算的结果是 dp(A.length()-1,B.length()-1)。即字符串A和字符串B的最长公共子序列长度。
假设输入的字符串A是
HIE
B是
MCHI
,目标就是要计算dp(2,3)
2表示A字符串的最后一个下标,3表示B字符串的最后一个下标
横坐标表示字符串A中参与计算最长公共子序列长度的最后一个字符;纵坐标表示字符串B中参与计算最长公共子序列长度的最后一个字符
- 先比较A和B的第一个字符,看不相等,执行不相等的逻辑,所以最大公共子序列要么在A[1:]和B[0:],要么在A[0:]和B[1:],要么在A[1:]和B[1:]