最长公共子序列(Longest-Common-Subsequences,LCS)是一个在一个序列集合中(一般为两个序列)用来查找全部序列中最长子序列的问题。这与查找最长公共子串的问题不一样的地方是:子序列不须要在原序列中占用连续的位置
。html
最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序,好比Diff工具,和生物信息学应用的基础。它也被普遍地应用在版本控制,好比Git用来调和文件之间的改变。python
最长公共子串(Longest-Common-Substring,LCS)问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列没必要是连续的,而子串却必须是
连续的。工具
例如序列str_a=world,str_b=wordl。序列wo是str_a和str_b的一个公共子序列,可是不是str_a和str_b的最长公共子序列,子序列word是str_a和str_b的一个LCS,序列worl也是。spa
暴力查找? 寻找LCS的一种方法是枚举X全部的子序列,而后注意检查是不是Y的子序列,并随时记录发现的最长子序列。假设X有m个元素,则X有2^m个子序列,指数级的时间,对长序列不实际。
根据上边分析结果,能够写出简洁易懂的递归方法。版本控制
def recursive_lcs(str_a, str_b): if len(str_a) == 0 or len(str_b) == 0: return 0 if str_a[0] == str_b[0]: return recursive_lcs(str_a[1:], str_b[1:]) + 1 else: return max([recursive_lcs(str_a[1:], str_b), recursive_lcs(str_a, str_b[1:])]) print(recursive_lcs('qweasde', 'asdzeexc'))
根据上述分析问题,动态规划递推公式也很是明显,能够写出动态规划代码:code
转载:https://www.cnblogs.com/CheeseZH/p/8830482.htmlhtm