package xyz.anduo.crawler; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class PageDistance { /** * @param s1 * @param s2 * @return */ public static <E> List<E> longestCommonSubsequence(E[] s1, E[] s2) { // 二维数组,初始化0 int[][] num = new int[s1.length+1][s2.length+1]; // 动态规划计算 for (int i = 1; i <= s1.length; i++) { for (int j = 1; j <= s2.length; j++) { if (s1[i - 1].equals(s2[j - 1])) { num[i][j] = 1 + num[i - 1][j - 1]; } else { num[i][j] = Math.max(num[i - 1][j], num[i][j - 1]); } } } System.out.println("length of LCS = " + num[s1.length][s2.length]); int s1position = s1.length, s2position = s2.length; List<E> result = new LinkedList<E>(); while (s1position != 0 && s2position != 0) { if (s1[s1position - 1].equals(s2[s2position - 1])) { result.add(s1[s1position - 1]); s1position--; s2position--; } else if (num[s1position][s2position - 1] >= num[s1position - 1][s2position]) { s2position--; } else { s1position--; } } Collections.reverse(result); return result; } public static void main(String[] args) { List<String> list = PageDistance.longestCommonSubsequence(new String[]{"a","b","c","b","d","a","b"}, new String[]{"b","d","c","a","b","a"}); for (String string : list) { System.out.println(string); } } }