最长公共子序列
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]); } } }
以上是关于最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章