我有两个列表,L1和L2。我需要检查L2是否是L1的连续子列表。 L1可以小于或大于L2(但从不完全相同的大小)。它们都是字符串列表,但是我需要检查L1中的元素是否包含L2中的元素(而不是直接相等)
这是一个很好的,简洁的方法吗?目前我只有两个迭代器相互追逐,但这似乎是不优雅的
答案 0 :(得分:3)
将i
设为0。
遍历L1
,检查匹配L2[i]
的元素。当你找到它时,增加i
。如果找不到,请将其重新设置为0.
如果i
达到L2
的长度,您就会在L2
内按顺序找到L1
的内容。
public boolean containsInOrder(List<Foo> list, List<Foo> pattern) {
int i=0;
for(Foo item : list) {
if(Objects.equals(item,pattern.get(i))) {
i++;
} else {
i=0;
}
if(i == pattern.size()) {
return true;
}
}
return false;
}
答案 1 :(得分:0)
递归回答因为我感到厚颜无耻:
public boolean containsInOrder(List<Foo> list, List<Foo> pattern) {
if(pattern.isEmpty()) {
return true;
}
if(list.isEmpty()) {
return false;
}
if(Objects.equals(head(list), head(pattern)) {
return containsInOrder(tail(list), tail(pattern));
}
// else
return containsInOrder(tail(list), pattern);
}
private Foo head(List<Foo> l) {
return l.get(0);
}
private List<Foo> tail(List<Foo> l) {
return l.subList(1,l.size());
}
不要在生产代码中使用它:由于Java没有尾部调用优化,如果列表很长,这将会che太多堆栈。但它是一个递归解决方案的有趣例子。