最长公共子序列LCS问题

冷不防 2022-09-17 15:21 314阅读 0赞

好久没有写博客了,刚才在网上看了清华大学的数据结构公开课,链接:https://www.xuetangx.com 可以注册个账号去听数据结构课程,老师讲的特好。

我的代码是按照老师讲的递归算法给了个java版本的实现(好久都没写c/c++代码了,手头也没有c++的IDE),通过java版本改c++或其他语言的版本也挺容易的。

递归是一种简单解法,刚开始理解会有困难,一个问题如果能简化为一个比原来问题规模小的问题和一个可以解决的问题,最后可以合并这两个问题的解得出原问题的解,那么

这样的一个问题可以用递归的方法来解决。

一个序列A[0,n],一个序列B[0,m]可以分为三种情况来考虑:

(1)、如果n=-1或者是m=-1,那么它们的最长公共子序列是空“”;

(2)、如果A[n]=B[m],那么这个问题其实可以简化为A[0,n-1],B[0,m-1],比如求“hello”与“exlo”的最长公共子序列,其实可以转化为”hell”与”exl”的最大公共子序列,然后再把最后的”o”加上就可以求解出。

(3)、如果A[n]!=B[m],那么可以转化为A[0,n-1)与B[0,m]或者是A[0,n]与[0,m-1),然后求出两者中的最长公共子序列。

清华大学的老师讲的很透彻,我在这表达的不是很清楚,爱学习的同学可以去这个链接:https://www.xuetangx.com 申请个账号,欣赏欣赏名校老师上课的风采。

  1. public static void main(String[] args) {
  2. String leftSequence = "computer";
  3. String rightSequence = "cmhjkute";
  4. String s = recGetLCS(leftSequence, leftSequence.length()-1,
  5. rightSequence, rightSequence.length()-1);
  6. System.out.println("*******");
  7. System.out.println(s);
  8. System.out.println("&&&&&&&&");
  9. }
  10. public static String recGetLCS(String leftSequence,
  11. int indexL, String rightSequence, int indexR) {
  12. if (indexL < 0 || indexR < 0) {
  13. return "";
  14. }
  15. if (leftSequence.charAt(indexL) == rightSequence.charAt(indexR)) {
  16. String lcs = recGetLCS(leftSequence, indexL-1, rightSequence, indexR-1)
  17. + leftSequence.charAt(indexL);
  18. return lcs;
  19. } else {
  20. String s1 = recGetLCS(leftSequence, indexL-1, rightSequence, indexR);
  21. String s2 = recGetLCS(leftSequence, indexL, rightSequence, indexR-1);
  22. if (s1.length() > s2.length()) {
  23. return s1;
  24. } else {
  25. return s2;
  26. }
  27. }
  28. }

下面我们就上代码

下面是运行结果:

20131028220504859

发表评论

表情:
评论列表 (有 0 条评论,314人围观)

还没有评论,来说两句吧...

相关阅读

    相关 公共序列LCS问题

    好久没有写博客了,刚才在网上看了清华大学的数据结构公开课,链接:https://www.xuetangx.com 可以注册个账号去听数据结构课程,老师讲的特好。 我的代码是按

    相关 LCS 公共序列

    首先要明白什么是子序列,什么是子串; 设:主串长度为n; 子序列:从主串中抽出少于n的元素组成的序列(这些抽出的元素比一定是连续的他们的相对位置不变);