先上運行結果截圖:
import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Random; public class Main10 { static class Position { private int x; private int y; private int times; } static void addPosition(int x, int y, List<Position> positionList) { Position position = new Position(); position.x = x; position.y = y; positionList.add(position); } static boolean equals(int[][] dp, int xi, int yi, char[] x, char[] y) { /* return dp[xi][yi] == dp[xi - 1][yi - 1] + 1 && dp[xi][yi] == dp[xi - 1][yi] + 1 && dp[xi][yi] == dp[xi][yi - 1] + 1;*/ return x[xi - 1] == y[yi - 1]; } static boolean xequals(int[][] dp, int i, int yLength) { for (int index = 0; index <= yLength; index++) { if (dp[i][index] != dp[i - 1][index]) { return false; } } return true; } static boolean yequals(int[][] dp, int j, int xLength) { for (int index = 0; index <= xLength; index++) { if (dp[index][j] != dp[index][j-1]) { return false; } } return true; } static boolean allequals(int[][] dp, int xi, int yi) { return dp[xi][yi] == dp[xi - 1][yi - 1] && dp[xi][yi] == dp[xi - 1][yi] && dp[xi][yi] == dp[xi][yi - 1]; } public static void main(String[] args) { char[] chars = "ABCDEFGHIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); int length = chars.length ; int MAX = 15 ; char[] y = new char[MAX]; char[] x = new char[MAX]; Random random = new Random(); for (int i = 0; i < MAX; i++) { int index = random.nextInt(1000000); x[i] = chars[index % length]; int index2 = random.nextInt(1000000); y[i] = chars[index2 % length]; } x= "tpDFsGjTkAyMMnL".toCharArray(); y = "MgdeieCAuKEvCkB".toCharArray(); int[][] dp = new int[x.length + 1][y.length + 1]; for (int xi = 0; xi < x.length; xi++) { for (int yi = 0; yi < y.length; yi++) { if (x[xi] == y[yi]) { dp[xi + 1][yi + 1] = dp[xi][yi] + 1; } else { dp[xi + 1][yi + 1] = Integer.max(dp[xi][yi + 1], dp[xi + 1][yi]); } } } print(dp, y, x); int max = dp[x.length][y.length]; StringBuilder sb = new StringBuilder(); LinkedList<Position> positions = new LinkedList<>(); int xi = x.length; int yi = y.length; while (true) { // 先進行預處理。。。 while (xequals(dp,xi,y.length)){ xi--; } while (yequals(dp,yi,x.length)){ yi--; } addPosition(xi, yi, positions); if (equals(dp, xi, yi, x, y)) { xi--; yi--; max--; sb.append(x[xi]); } else { if (dp[xi - 1][yi] >= dp[xi][yi - 1]) { xi--; } else { yi--; } } if (max == 0) { String temp = new StringBuilder(sb.toString()).reverse().toString(); System.out.println(temp); printList(positions); // 沿路返回 for (; ; ) { Position last = positions.getLast(); xi = last.x; yi = last.y; last.times++; if (equals(dp, xi, yi, x, y)) { positions.removeLast(); printList(positions); sb.delete(sb.length() - 1, sb.length()); max++; } else { if (dp[xi][yi - 1] == dp[xi - 1][yi]) { if (last.times == 2) { positions.removeLast(); printList(positions); } else { yi--; break; } } else { positions.removeLast(); printList(positions); } } if (positions.isEmpty()) { System.exit(0); } } } } } public static void print(int[][] dp, char[] a, char[] b) { int y = dp[0].length; System.out.print(0 + "\t"); System.out.print(0 + "\t"); for (int i = 1; i < y; i++) { System.out.print(i + "\t"); } System.out.println(); System.out.print(0 + "\t"); System.out.print(0 + "\t"); for (char ac : a) { System.out.print(ac + "\t"); } System.out.println(); for (int i = 1; i < dp.length; i++) { System.out.print(i + "\t"); System.out.print(b[i - 1] + "\t"); for (int j = 1; j < dp[0].length; j++) { System.out.print(dp[i][j] + "\t"); } System.out.println(); } System.out.println(); } private static void printList(List<Position> positionList) { Iterator<Position> iterator = positionList.iterator(); while (iterator.hasNext()) { Position next = iterator.next(); System.out.print(String.format("(%d,%d)\t", next.x, next.y)); } System.out.println(); } }
md,仍然會有重複的輸出!!!