zoukankan      html  css  js  c++  java
  • 最长回文子序列(LPS)

    问题描述:

    回文是正序与逆序相同的非空字符串,例如“civic”、“racecar”都是回文串。任意单个字符的回文是其本身。

    求最长回文子序列要求在给定的字符串中找出最长的回文子序列(即找出的序列不要求在原序列中连续)。

    例如,序列A=“javaej”,其最长回文子序列为“javaj”,长度为5。

    递推关系:

    其子问题的填充顺序为(以javaej为例):

     

    算法实现:

    package agdp;
    public class LPS {
        public static int getLPS(String str){
            int n = str.length();
            int[][] aux = new int[n][n];
            for (int i = 0; i < n; i++) {
                aux[i][i] = 1;//单子字符,最长回文子序列长度为1
            }
            for (int l = 2; l <= n; l++) {//子序列长度,从2到n
                for (int i = 0,j; i <= n-l; i++) {
                    j = l+i-1;
                    if (str.charAt(i) == str.charAt(j)) {
                        aux[i][j] = aux[i+1][j-1]+2;//首尾元素相等,必是回文子序列中的元素
                    }else {
                        //首尾元素不等,取(i+1)->j序列和i->(j-1)系列中较长的回文子序列
                        aux[i][j] = Math.max(aux[i+1][j], aux[i][j-1]);
                    }
                }
            }
            return aux[0][n-1];
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    //        String str = "character";;
            String str = "javaej";
            int result  = getLPS(str);
            System.out.println(result);
        }
    }
  • 相关阅读:
    Beta冲刺置顶随笔
    Beta总结
    用户试用与调查报告
    Beta冲刺第七天
    Beta冲刺第六天
    Beta冲刺第五天
    Beta冲刺第四天
    Beta冲刺第三天
    Beta冲刺第二天
    爬虫基本操作
  • 原文地址:https://www.cnblogs.com/qcblog/p/7819393.html
Copyright © 2011-2022 走看看