1143. 最长公共子序列
分析
-
定义状态:
f[i][j]
表示字符串text1
的前i
个字符与text2
的前j
个字符的最长公共子序列的长度
-
状态转移:
-
当
text1[i-1] == text2[j-1]
,当前字符匹配,可以延续公共子序列的长度:f[i][j] = f[i-1][j-1] + 1
-
当
text1[i-1] != text2[j-1]
,当前字符不匹配,最长公共子序列取决于舍弃其中一个字符的结果:f[i][j] = \max(f[i-1][j], f[i][j-1])
-
-
边界条件:
f[i][0] = 0
和f[0][j] = 0
,表示任意一个字符串与空字符串的最长公共子序列长度为0
-
结果:
- 最终结果存储在
f[n][m]
,其中n
和m
分别是text1
和text2
的长度
- 最终结果存储在
时间复杂度
外层循环遍历 n
,内层循环遍历 m
,时间复杂度为 O(nm)
空间复杂度
空间复杂度为 O(nm)
C++代码
|
|