动态规划算法:
是一种解决棘手问题的方法,它将问题分成小问题,并先着手解决这些小问题。但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用。
在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。
设计动态规划解决方案的通用小贴士:
1、每个动态规划算法都从一个网格开始。
2、单元格中的值通常就是要优化的值。
3、每个单元格都是一个子问题,因此应考虑如何将问题分成子问题,这有助于找出网格的坐标轴。
最长公共子串:
两个字符串都包含的最长连续子串。
最长公共子序列:
两个字符串都包含的最长有序子串。
最长公共子串要求在原字符串中是连续的,而最长公共子序列只需要保持相对顺序一致,并不要求连续。
以下2例中待处理字符串:
# str_a = 'cnbalodgs'
# str_b = 'cbaelodng'
# str_a = 'abcdfg'
# str_b = 'abdfg'
str_a = 'abcbdab'
str_b = 'bdcaba'
# str_a = 'abcbdecb'
# str_b = 'ebdeaba'
示例:获取最长公共子串
解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。
# 此例中有多个相同长度的公共子串,但只能获取第一个子串
def find_lcsubstr(s1, s2):
# 下面4行不要直接写在循环中,减少计算
s1_len = len(s1) + 1 #为方便后续计算,多了1行1列
s2_len = len(s2) + 1
s3_len =