有很多方法可以解释这个问题。我们是在寻找由列表表示的集合的交集,还是在寻找最长的公共子序列?列表总是排序的吗?
在我的递归解决方案中,我假设我们正在寻找一些最长的子序列,并且我不假设关于项目顺序的任何事情:
private static <T> List<T> longestCommonSubseq(List<T> a, int indA, List<T> b, int indB){
if (indA == a.size() || indB == b.size())
return Collections.emptyList();
T itemA = a.get(indA);
T itemB = b.get(indB);
List<T> res;
if (itemA.equals(itemB)){
res = new ArrayList<T>();
res.add(itemA);
res.addAll(longestCommonSubseq(a, indA+1, b, indB+1));
}else{
List<T> opt1 = longestCommonSubseq(a, indA+1, b, indB);
List<T> opt2 = longestCommonSubseq(a, indA, b, indB+1);
if (opt1.size()>opt2.size())
res = opt1;
else
res = opt2;
}
return res;
}
public static <T> List<T> longestCommonSubseq(List<T> a, List<T> b){
return longestCommonSubseq(a,0,b,0);
}
注意:为简单起见,在我的解决方案中,列表应该是随机访问的(例如 ArrayList)。