package AlogPub.first;
import java.util.HashSet;
import java.util.Set;
import jdk.javadoc.internal.doclets.formats.html.SourceToHTMLConverter;
public class LCSFind {
//使用迭代
//求出所有子序列最长子序列长度db
private static int[][] LCS1(char[] x,char[] y){
int lenx=x.length;
int leny=y.length;
int[][] db=new int[lenx+1][leny+1];
for (int i = 1; i <= lenx; i++) {
for (int j = 1; j <= leny;j++) {
if (x[i-1]==y[j-1]){
db[i][j]= db[i-1][j-1]+1;
}
if(x[i-1]!=y[j-1]){
db[i][j]=Math.max(db[i-1][j], db[i][j-1]);
}
}
}
return db;
}
//使用递归
//求出x的前i个元素和y的前j个元素的最大子序列
private static String LSC2(char[] x,char[] y,int i,int j){
if(i==0 ||j==0 ){
return "";
}
if(x[i]==y[j]){
return LSC2(x, y, i-1, j-1)+x[i];
}
if(x[i]!=y[j]){
return LSC2(x, y, i-1, j).length()>LSC2(x, y, i, j-1).length()?LSC2(x, y, i-1, j):LSC2(x, y, i, j-1);
}
return "";
}
//求出所有最大子序列
private static String[] LSC3(char[] x,char[] y,int i,int j){
if(i==0 ||j==0 ){
String[] resStr={""};
return resStr;
}
if(x[i]==y[j]){
String[] strings=LSC3(x, y, i-1, j-1);
for (int k = 0; k < strings.length; k++) {
strings[k]+=x[i];
}
return strings;
}
if(x[i]!=y[j]){
if(LSC3(x, y, i-1, j)[0].length()>LSC3(x, y, i, j-1)[0].length()){
return LSC3(x, y, i-1, j);
}
if(LSC3(x, y, i-1, j)[0].length()<LSC3(x, y, i, j-1)[0].length()){
return LSC3(x, y, i, j-1);
}
if(LSC3(x, y, i-1, j)[0].length()==LSC3(x, y, i, j-1)[0].length()){
Set<String> set=new HashSet<>();
for (int j2 = 0; j2 < LSC3(x, y, i-1, j).length; j2++) {
set.add(LSC3(x, y, i-1, j)[j2]);
}
for (int j2 = 0; j2 <LSC3(x, y, i, j-1).length; j2++) {
set.add(LSC3(x, y, i, j-1)[j2]);
}
StringBuilder sb=new StringBuilder();
set.forEach(v->sb.append(v+" "));
return sb.toString().split(" ");
}
}
return null;
}
public static void main(String[] args) {
char[] x={'a','b','d','e','r'};
char[] y={'e','b','f','d','y','r','e'};
// int[][] res= LCS1(x, y);
// for (int[] is : res) {
// for (int is2 : is) {
// System.out.print(is2);
// }
// System.out.println();
// }
// String resStr=LSC2(x, y, x.length-1, y.length-1);
// String resStr=LSC2(x, y, 1, 1);
// System.out.println(resStr);
// }
// String resStr=LSC2(x, y, 1, 1);
String[] resStr=LSC3(x, y, x.length-1, y.length-1);
for (int i = 0; i < resStr.length; i++) {
System.out.println(resStr[i]);
}
}
}
每日算法:LCS问题
最新推荐文章于 2022-04-14 15:08:56 发布