关闭

递归法之最长回文子序列(java)

标签: java递归最长回文子序列算法设计
278人阅读 评论(0) 收藏 举报
分类:

1.如果str的最后一个元素和第一个元素是相同的,则有:lps(0,n-1)=lps(1,n-2)+2;例如字符串序列“AABACACBA”,第一个元素和最后一个元素相同,其中lps(1,n-2)表示红色部分的最长回文子序列的长度;

2.如果str的最后一个元素和第一个元素是不相同的,则有:lps(0,n-1)=max(lps(1,n-1),lps(0,n-2));例如字符串序列“ABACACB”,其中lps(1,n-1)表示去掉第一元素的子序列,lps(0,n-2)表示去掉最后一个元素的子序列。


返回最长回文子序列的长度:

package ddd.lps;

public class LPS {
    public static void main(String args[]) {
        String string = "ACGTGTCAAAATCG";
        System.out.println("最长回文子序列長度为:" + lps(string, 0, string.length() - 1));
    }

    public static int lps(String str, int start, int end) {
        if (start == end) {
            return 1;
        }
        if (start > end) {
            return 0;
        }
        /* 首尾相同时,则首尾是回文子序列的一部分length+2,lps(str, start + 1, end - 1)表示去掉下标为start和end后的字符串进行递归的到的最长子序列;*/
        if (str.charAt(start) == str.charAt(end)) {
            return lps(str, start + 1, end - 1) + 2;
        } else {
            /* 首尾不相同时,lps(str, start + 1, end)表示去掉下标为start后的字符串的最长子序列,lps(str, start, end - 1)表示去掉下标为end后的字符串的最长子序列*/
            return max(lps(str, start + 1, end), lps(str, start, end - 1));
        }
    }

    public static int max(int x, int y) {
        return (x > y) ? x : y;
    }
}

返回最长回文子序列:

package ddd.lps;

public class LPS2 {
    public static void main(String args[]) {
        String string = "ACGTGTCAAAATCG";
        String result = lps(string, 0, string.length() - 1);
        System.out.println("最长回文子序列为:" + result);
        System.out.println("最长回文子序列的长度为:" + result.length());
    }

    public static String lps(String str, int start, int end) {
        if (start == end) {
            return str.charAt(end) + "";
        }
        if (start > end) {
            return "";
        }
        if (str.charAt(start) == str.charAt(end)) {
            return str.charAt(start) + lps(str, start + 1, end - 1) + str.charAt(end);
        } else {
            String right = lps(str, start + 1, end);
            String left = lps(str, start, end - 1);
            int max = max(left.length(), right.length());
            if (max == left.length()) {
                return left;
            } else {
                return right;
            }
        }
    }
    public static int max(int x, int y) {
        return (x > y) ? x : y;
    }
}
1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

python对指定字符串寻找回文子序列的最小划分

思想同上一篇博文,具体实现如下: #!usr/bin/env python #encoding:utf-8 ''' __AUthor__:沂水寒城 功能:对指定字符串寻找回文子序列的最小划分 ''...
  • Together_CZ
  • Together_CZ
  • 2017-08-03 14:22
  • 257

python实现寻找最长回文子序列

这一类的问题可以使用动态规划的方法去做,我之前应该有几篇博文都是关于回文序列的求解的,正好有可以复用的代码就懒得再用别的方法写了,直接套用,思想还是滑窗切片,很简单就是运算会多点,下面是具体实现: ...
  • Together_CZ
  • Together_CZ
  • 2017-08-04 20:29
  • 630

经典算法——最长回文子序列

最长回文子序列LPS(Longest Palindromic Subsequence)问题 一个字符串有许多子序列,比如字符串cabbeaf,它的子序列有c、abb、e、a、f,可以通过删除某些字...
  • geekmanong
  • geekmanong
  • 2016-04-04 14:48
  • 7069

算法导论-第15章-动态规划-15-2 最长回文子序列(LPS)

问题描述 回文序列(Palindromic sequence, Palindrome)是指正向遍历和反向遍历完全相同的序列,例如字符串“AAAAA”显然是一个回文序列,又如字符串“ABC@CBA”也是...
  • u012243115
  • u012243115
  • 2014-11-11 14:11
  • 3005

提取最长回文子串的java实现

题目描述 给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最...
  • hanleijun
  • hanleijun
  • 2014-05-09 22:02
  • 3552

动态规划之最长回文子序列

第三版《算法导论》动态规划新增题目之求最长回文子序列。只要能看到书中LCS代码,这个问题就能解决。
  • z84616995z
  • z84616995z
  • 2014-08-09 16:39
  • 2963

算法导论—最长回文子串和子序列

华电北风吹 2016/3/6回文串是指正序和逆序均相同的字符串。在回文子串的求解过程中,根据每个字符是否连续问题又可分为最长回文子串(绝对回文)和最长回文子序列(相对回文)。求解一个字符串中最长回文...
  • zhangzhengyi03539
  • zhangzhengyi03539
  • 2016-03-06 21:19
  • 762

算法导论——动态规划之最长公共子序列(LCS)和最长回文子序列(LPS)

有两个字符串A和B,假设为A=”abcbdab”,B=”bdcaba”;最长公共子序列(LCS)问题指的时找到A和B的一个公共的子串C,C的长度要是最长。 在这里我们很明显的发现最长子序列为”bcb...
  • a591193965
  • a591193965
  • 2015-09-09 20:46
  • 1283

动态规划解最长回文子序列并优化空间复杂度

本文用动态规划的思想解决最长回文子序列问题,代码简介明了。之后再用很巧妙的方法把空间复杂度从O(n^2)降到O(n)。
  • u012077163
  • u012077163
  • 2013-11-19 01:07
  • 3193

计算回文子序列(Java语言,动态规划,递归)

LCS是指最长公共子序列。计算2个字符串的LCS广泛应用于搜索引擎,文本编辑器,字符串比较工具,IDE等工具中。 LCS计算基于已经证明的一种递推关系。即: 1.当Xm == Yn时,LCS(X(...
  • hhdsyxwei
  • hhdsyxwei
  • 2016-06-15 18:04
  • 685
    个人资料
    • 访问:9830次
    • 积分:157
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:1篇
    • 译文:1篇
    • 评论:3条
    文章分类