如何查找列表是否是另一个列表的子集?

时间:2014-04-11 06:38:49

标签: c++ list subset

struct Node {
    int value;
    Node* next;
};

bool propSubset(Node* p, Node* q) {
    if(q == nullptr) return false;
    if(p == nullptr && q != nullptr) return true;
    if(p->value < q->value) return false;
    if(p->value > q->value) return propSubset(p, q->next);
    return propSubset(p->next, q->next);
}

p是q的子集,如果

  • p的所有元素都是q
  • 的元素
  • q至少有一个不在p。
  • 的元素

p和q都按升序排序。

这是我得到的全部,但它不适用于p = {2,4},q = {1,2,3,4}的情况 我怎样才能改善这个?感谢

2 个答案:

答案 0 :(得分:1)

迭代解决方案可能会更好。给定任意长度的列表,您不希望存在耗尽堆栈空间的风险。

因为q中的非交叉元素可以随机分布,所以尺寸因子起作用。

您可能希望重构代码,例如:

bool propSubset(Node* p, Node* q) {
  int len_q = length(q); // assuming you have length function.
  if (length(p) >= len_q) return false;

  for(int i=0; i < len_q && p != nullptr; ++i) {
    if (p->value == q->value) p = p->next;
    if (p->value < q->value) return false; // That particular value in p is not in q.
    q = q->next;
  }
  if (p == nullptr) return true;
  return false;
}

答案 1 :(得分:0)

你假设不在p中的q元素总是在列表的最后。您需要考虑额外元素可以在列表中的任何位置,而不仅仅是列表的末尾,您将走在正确的道路上。