zoukankan      html  css  js  c++  java
  • 【动态规划】— 最长公共子序列

    package base;
    
    import java.util.LinkedList;
    import java.util.List;
    
    //O(mn)动态规划求最长公共子序列 
    public class MaxSeq {
        
        private static String str = "aebae";  //为了方便直接用自身和自身的逆序 m=n
        private int strSize = str.length();
        
        public static void main(String[] args) {
            
            MaxSeq pr = new MaxSeq();
            int strSize = str.length();
            int[][] maxArray = new int[strSize+1][strSize+1];;
            pr.buildMaxArray(maxArray, str);
            System.out.println("The One of MaxSeqs For this String is = " + pr.getMaxMaxSeq(maxArray, str));
        }
        
        private void buildMaxArray(int[][] maxArray,String str){
            
            char[] array = str.toCharArray();
            char[] array2 = new StringBuilder(str).reverse().toString().toCharArray();
            
            for(int i=1;i<strSize+1;i++){
                for(int j=1;j<strSize+1;j++){
                    if(array2[i-1] == array[j-1]){
                        maxArray[i][j] = maxArray[i-1][j-1]+1;
                    }else 
                        maxArray[i][j] = Math.max(maxArray[i-1][j], maxArray[i][j-1]);
                }
            }
        }
        
        private String getMaxMaxSeq(int[][] maxArray,String str){
            
            char[] array = str.toCharArray();
            char[] array2 = new StringBuilder(str).reverse().toString().toCharArray();
            int i = strSize;
            int j = strSize;
            List<Character> resultList = new LinkedList<Character>();
            while(i>0 && j>0){
                if(array[j-1] == array2[i-1]){
                    resultList.add(array[j-1]);
                    i--;
                    j--;
                }else{
                    if(maxArray[i][j-1] >= maxArray[i-1][j]){
                        j--;
                    }else{
                        i--;
                    }
                }
            }
            return resultList.toString();
        }
    }

    注意:最长公共自序列是可以不连续的,而最长公共子串必须是连续的。

  • 相关阅读:
    2013 HIT 春季校赛C题
    2013610 四省赛
    [BZOJ] 1441 Min
    移植中Makefile学习 关键字理解
    Emgu 学习之HelloWorld
    XML 基本概念和XPath选择
    AI 资源帖
    c语言 static
    Linux watch命令 实时监测命令的运行结果(转)
    ctags 注意点
  • 原文地址:https://www.cnblogs.com/lixusign/p/2465027.html
Copyright © 2011-2022 走看看