最长公共子序列

package org.unclehu;

import sun.security.util.Length;

/**
 * 求最长公共子序列
 */
import java.util.Scanner;

public class LCS {
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        String str ;
        while(true){
            str=scanner.nextLine();
            if(str.length()<1) break;
            String strRev = new StringBuilder(str).reverse().toString();
            int len = str.length();
            //构造lcs矩阵
            int[][] lcs = new int[len+1][len+1];
            for(int i=0;i<len;i++){
                for(int j=0;j<len;j++){
                    //如果相等 
                    if(str.charAt(i)==strRev.charAt(j)){
                        lcs[i+1][j+1] = lcs[i][j]+1;
                    }else{
                        //如果不相等则选择左边上边最大的
                        lcs[i+1][j+1] = Math.max(lcs[i][j+1],lcs[i+1][j]);
                    }
                }
            }
            int n = lcs[len][len];
            int a[] = new int[n];
            int j=len,k=len;
            int w=0;
            while(lcs[k][j]!=0){

                if(str.charAt(k-1)==strRev.charAt(j-1)){
                    a[w]=k-1;
                    w++;
                }
                if(lcs[k-1][j-1]>=lcs[k][j-1]&&lcs[k-1][j-1]>=lcs[k-1][j]) {k-=1;j=j-1;}
                else if(lcs[k][j-1]>lcs[k-1][j]) j-=1;
                else if(lcs[k][j-1]<lcs[k-1][j]) k-=1;
                else k-=1;

            }
            //输出其中一个最长子序列
            for(int i=a.length-1;i>=0;i--){
                System.out.print(str.charAt(a[i]));
            }
            System.out.println();
            System.out.println(len-lcs[len][len]);
        }
    }
}

 

posted @ 2018-09-27 23:59  胡叔叔  阅读(130)  评论(0编辑  收藏  举报