【动态规划】最长公共子序列 Description 给定两个字符串,返回两个字符串的最长公共子序列(不是最长公共子字符串),可能是多个。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
 * 
* 

Title: Main

*

Description: * 最长公共子序列 Description 给定两个字符串,返回两个字符串的最长公共子序列(不是最长公共子字符串),可能是多个。 Input 输入第一行为用例个数, 每个测试用例输入为两行,一行一个字符串 Output 如果没有公共子序列,不输出,如果有多个则分为多行,按字典序排序。 Sample Input 1 1 1A2BD3G4H56JK 23EFG4I5J6K7 Sample Output 1 23G456K 23G45JK *

* @author ydc * @date 2019年10月29日 */ public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int cases = Integer.valueOf(input.nextLine()); while(cases > 0) { cases--; String str1 = input.nextLine(); String str2 = input.nextLine(); firWay(str1, str2); } } /** * *

Title: firWay

*

Description: * 应用动态规划的方法查找两字符串最长的公共子序列 * i=0 || j=0 --> count[i][j] = 0 * i>0 && j>0 && str1[i-1]==str2[j-1] --> count[i][j] = count[i-1][j-1] + 1 * i>0 && j>0 && str1[i-1]!=str2[j-1] --> count[i][j] = max{count[i-1][j],count[i][j-1]} *

* @param str1 * @param str2 */ public static void firWay(String str1, String str2) { int[][] count = new int[str1.length()+1][str2.length()+1]; int maxLen = 0; for(int i=1; i maxLen) { maxLen = count[i][j]; } } } //System.out.println("lenth: " + maxLen); List maxFlag = new ArrayList<>(); String flag; for(int i=1; i list = new ArrayList<>(); for(int f=0; fTitle: findStr

*

Description: * 根据动态规划生成二维数组count,递归查找子序列 *

* @param list 子序列列表 * @param count 动态规划生成的二维数组 * @param str1 字符串 * @param str2 字符串 * @param i 最长子序列末端坐标 * @param j 最长子序列末端坐标 * @param item 子序列的部分 */ public static void findStr(List list, int[][] count, String str1, String str2, int i, int j, String item) { if(i==0 || j==0) { if(list.indexOf(item) == -1) list.add(item); return; } else { if(str1.charAt(i-1) == str2.charAt(j-1)) { String string = str1.charAt(i-1) + item; findStr(list, count, str1, str2, i-1, j-1, string); } else if(count[i-1][j] > count[i][j-1]){ findStr(list, count, str1, str2, i-1, j, item); } else if(count[i-1][j] < count[i][j-1]) { findStr(list, count, str1, str2, i, j-1, item); } else { findStr(list, count, str1, str2, i-1, j, item); findStr(list, count, str1, str2, i, j-1, item); } } } }

 

你可能感兴趣的:(算法,java)