动态规划-最长公共子序列

来源:互联网 发布:涡扇15发动机 知乎 编辑:程序博客网 时间:2024/06/07 00:06

关于最长公共子序列问题的分析,这篇博客讲的比较好

http://blog.csdn.net/yysdsyl/article/details/4226630

下面给出我写的java代码:

import java.util.Arrays;import java.util.Scanner;public class LCS {static StringBuffer str=new StringBuffer();static void ff(char []a,char []b){int [][]c=new int[a.length+1][b.length+1];int [][]k=new int[a.length][b.length];for(int i=1;i<=a.length;i++){for(int j=1;j<=b.length;j++){if(a[i-1]==b[j-1]){c[i][j]=c[i-1][j-1]+1;k[i-1][j-1]=0;   }else{if(c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];k[i-1][j-1]=1;}else{c[i][j]=c[i][j-1];k[i-1][j-1]=-1;}}}}System.out.println("最长公共长度:"+c[a.length][b.length]);lsc(k,a,b);str.reverse();System.out.println("最长公共子序列:"+str);}static void lsc(int [][]k,char []a,char []b){int num1=a.length;int num2=b.length;if(num1>=1&&num2>=1){if(k[num1-1][num2-1]==0){str.append(a[num1-1]);a=Arrays.copyOf(a, a.length-1);b=Arrays.copyOf(b, b.length-1);lsc(k,a,b);}else if(k[num1-1][num2-1]==1){a=Arrays.copyOf(a, a.length-1);lsc(k,a,b);}else if(k[num1-1][num2-1]==-1){b=Arrays.copyOf(b, b.length-1);lsc(k,a,b);}}else{return ;}}public static void main(String[] args) {Scanner input=new Scanner(System.in);System.out.print("请输入字符串a:");String str1=input.nextLine();System.out.print("请输入字符串b:");String str2=input.nextLine();char []ch1=str1.toCharArray();char []ch2=str2.toCharArray();ff(ch1,ch2);}}


0 0