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();
        }
    }

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

  • 相关阅读:
    win10- *.msi 软件的安装,比如 SVN安装报2503,2502
    Java-byte[]与16进制字符串互转
    log4j 日志脱敏处理 + java properties文件加载
    CentOS7编译安装SVN(subversion1.9.7)
    Samba安装与配置
    php 实现redis发布订阅消息及时通讯
    PHP中使用ActiveMQ实现消息队列
    sphinx 配置文件全解析
    nginx和apache 配置
    php实现汉诺塔问题
  • 原文地址:https://www.cnblogs.com/lixusign/p/2465027.html
Copyright © 2011-2022 走看看