最长公共子序列

Posted unclehu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列相关的知识,希望对你有一定的参考价值。

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

 

以上是关于最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章

最长公共子序列与最长公共字串

最长公共子序列

最长公共子序列

字符串最长公共子序列问题

最长公共子序列

最长公共子序列