最长公共子序列和最长公共子串问题
最长公共子串及公共子序列问题属于一类问题,都可以使用动态规划的算法来解析,且动态规划方式比较类似,比较容易混淆。
定义
最长公共子串:两个字符串中,相同的最长子串,字符必须是连续的
最长公共子序列:两个字符串中,相同的最长序列,字符不一定是连续的
比如:a[] = “abcde” b[] = “bce”
那么:
最长子串:”bc”
最长子序列:”bce”
解法
假设A、B分别表示两个字符串
最长公共子串
dp[i][j]表示子串A[:i]、B[:j]必须以A[i]、B[j]为结尾的两个字符串的最大子串长度
1 | if A[i] == B[j] { |
最终dp二维数组中的最大值即为结果
最长公共子序列
dp[i][j]表示子串A[:i]、B[:j]的两个字符串的最大子序列
1 | if A[i] == B[j] { |
最终dp[i-1][j-1]为结果
leetcode
- Delete Operation for Two Strings (最长公共子序列)
- Maximum Length of Repeated Subarray (最长公共子串)