[算法] 最长公共子序列

问题

  • 一个序列 S 任意删除若干个字符得到新序列 T ,则 T 叫做 S 的子序列;
  • 两个序列 X Y 的公共子序列中,长度最长的那个,定义为 X Y 的最长公共子序列(LCS,Longest Common Subsequence):
    • 字符串 13455 245576 的最长公共子序列为 455
    • 字符串 a c d f g a d f c 的最长公共子序列为 a d f
  • 注意区别最长公共子串(Longest Common Substring)
    • 最长公共子串要求连续

分析

暴力求解法

  • 假定字符串 X Y 的长度分别为 m n ;
  • X 的一个子序列即下标序列 { 1 2 . . . m } 的严格递增子序列,因此 X 共有 2 m 个不同的子序列;同理, Y 2 n 个不同子序列,从而穷举搜索法需要指数时间 O ( 2 m 2 n )
  • X 的每一个子序列,检查它是否也是 Y 的子序列,从而确定它是否为 X Y 的公共子序列,并且在检查过程中选出最长的公共子序列;

LCS解法探索

LCS的记号

  • 字符串 X ,长度为 m ,从1开始数;
  • 字符串 Y ,长度为 n ,从1开始数;
  • X i =< x 1 , . . . , x i > X 序列的前 i 个字符( 1 i m )( X i 不妨读作字符串 X i 前缀);
  • Y j =< y 1 , . . . , y i > Y 序列的前 j 个字符( 1 j n )(字符串 Y j 前缀);
  • L C S ( X , Y ) 为字符串 X Y 的最长公共子序列,即为 Z =< z 1 , . . . , z k >
    • 注意:事实上, X Y 可能存在多个子串,长度相同并且最大,因此, L C S ( X , Y ) 严格的说,是个字符串集合。即 Z L C S ( X , Y )

若 xm=yn

猜你喜欢

转载自blog.csdn.net/zkp_java/article/details/80768048
今日推荐