输出所有最长公用子序列的实现(Java)
2014-10-31 15:59
253 查看
输出所有最长公用子序列的实现(Java)
前言:
最长公共子序列的算法是比较经典的,在算法导论给出的经典算法可以实现输出一条最长公共子序列。但是有多个最长公共子序列怎么办呢?其实也比较简单就是把那三种情况分为四种即可:斜向上、向左、向上、向左或向上。在搜索时遇到两个方向时,一直选择一个方向即可。这样做可以找到所有的最长公共子序列,但是会有重复,可以用set集去重即可。另外有一篇硕士论文是讲了一种基于这种思想的方法,借助了两个辅助栈。感兴趣的也可看看这个链接:http://www.docin.com/p-759517222.html。下面给出基本的输出最长公共子序列的Java实现。
代码实现:
package com.lcs; import java.util.Scanner; import java.util.TreeSet; public class Lcs { public StringBuffer X; public StringBuffer Y; public static int m; public static int n; public int len; public static int[][] b; public int[][] c; public String[] Log; public char[] lcs; public final int MAX = 100; public int CurLen; public static void main(String[] args) { Lcs lcs = new Lcs(); lcs.search(); } public void search() { while(true) { System.out.println("\n" + "请选择功能:"); System.out.println("\n" + "1.寻找最长公共子序列"); System.out.println("\n" + "2.结束"); Scanner in = new Scanner(System.in); int choose = in.nextInt(); switch(choose) { case 1: System.out.println("请输入序列X:"); X = new StringBuffer(in.next()); System.out.println("请输入序列Y:"); Y = new StringBuffer(in.next()); lcs_length(); System.out.println("两序列的最长公共子序列为:"); storeLCS(m,n,len); PrintLCS(); X.setLength(0); Y.setLength(0); break; case 2: in.close(); System.exit(0); break; default: in.close(); System.exit(-1); } } } public void lcs_length() { m = X.length(); n = Y.length(); c = new int[m+1][n+1]; b = new int[m+1][n+1]; for(int i = 1; i <= m; i++) c[i][0] = 0; for(int j = 0; j <= n; j++) c[0][j] = 0; for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) { if(X.charAt(i-1) == Y.charAt(j-1)){ c[i][j] = c[i-1][j-1] + 1; b[i][j] = 0; } else if(c[i-1][j] > c[i][j-1]) { c[i][j] = c[i-1][j]; b[i][j] = 1; } else if(c[i-1][j] == c[i][j-1]){ c[i][j] = c[i-1][j]; b[i][j] = 2; }else { c[i][j] = c[i][j-1]; b[i][j] = 3; } } lcs = new char[m+1]; len = c[m] ; Log = new String[MAX]; CurLen = 0; } public void storeLCS(int m,int n,int Len) { if(m == 0 || n == 0) { Log[CurLen] = new String(lcs); CurLen++; } else { if(b[m] == 0) { lcs[Len] = X.charAt(m-1); Len--; storeLCS(m-1,n-1,Len); } else if(b[m] == 3) { storeLCS(m,n-1,Len); } else if(b[m] == 1) { storeLCS(m-1,n,Len); } else { storeLCS(m,n-1,Len); storeLCS(m-1,n,Len); } } } public void PrintLCS() { TreeSet<String> tr = new TreeSet<String>(); for(int i = 0; i < CurLen; i++) { tr.add(Log[i]); } String[] s2= new String[tr.size()]; for(int i = 0; i < s2.length; i++) { s2[i]=tr.pollFirst();//从TreeSet中取出元素重新赋给数组 System.out.println(s2[i]); } } }
相关文章推荐
- 输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
- Java实现求最长增长子序列长度,并输出该子序列值
- java实现输入一个正整数n,输出全部连续正整数相加后等于n的所有序列。
- Java 组合的实现- 输入一个字符,输出字符中字母组成的所有组合
- 用java实现将一个项目中所有的.java文件合并输出至某文件
- java动态规划 实现输出最大公共子序列的长度以及输出最大子字符串
- Java实现由前序序列和中序序列重建二叉树,并后序输出。
- 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码【123和12345】那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出的电话号码(java实现)
- 最长回文子序列 java递归实现
- 最长公共子序列问题-求所有公共子序列(java核心代码实现)
- 输出n对括号所有有效的匹配 java实现
- LIS 最长递增子序列 Java实现
- 输出最长子串 Java实现
- LIS 最长递增子序列 Java的简单实现
- 用java实现:判断1-100之间有多少个素数,并输出所有素数
- 输出一个集合的所有子集合-Java代码实现(一)
- 判断101-200之间有多少个素数,并输出所有素数 Java实现
- java实现输出数据表的所有字段
- JAVA:递归实现输出正整数和等于n的所有不增的正整数和式