最长子串 - 图1
    数学归纳法:
    dp(str1,str2) 代表对 str1str2 求最长子序列

    1. # str[i] 代表 str[0:i] 子串
    2. # =>1
    3. str1 = B # 紫色
    4. str2[] = A, AB,...,ABAZDC
    5. for str2 in str2[]:
    6. dp(str1, str2)
    7. # => i
    8. # 末尾字符串相同:
    9. str1 = '...A'
    10. str2 = '....A'
    11. # 此时所求最长公共子序列为
    12. dp(str1[i-1], str2[i-1]) + 1
    13. 末尾字符串不同:
    14. str1 = '...A'
    15. str2 = '....B'
    16. max(dp(str[i-1],str[i]), dp(str[i],str[i-1]))

    程序示例:

    string1 = "BACBAD"
    string2 = "ABAZDC"
    dp = [0] * (len(string2) + 1)
    for i in range(1, len(string1) + 1):
        str1 = string1[:i]
        for j in range(1, len(string2) + 1):
            str2 = string2[:j]
            if str1[-1] == str2[-1]:
                dp[j] = dp[j - 1] + 1
                continue
            if str1[-1] != str2[-1]:
                dp[j] = max(dp[j - 1], dp[j])
                continue
        print(*dp, sep=" ")