检查数组是否是有序子集

时间:2017-12-04 15:33:23

标签: ruby

我想知道数组是否是另一个数组的有序子集:

  • [1,2][1,2,3]
  • 的有序子集
  • [1,3][1,2,3]
  • 的有序子集
  • [2,1]不是[1,2,3]
  • 的有序子集

我找到了一些解决方案,但每个解决方案都忽略了订单。到目前为止我看到的每个方法都忽略了数组的顺序:

[1,2,3] - [2,1] #=> [3]
[1,2,3] & [2,1] #=> [1,2]
[1,2,3].to_set.superset?([2,1].to_set) #=> true

更新 根据下面的讨论,我已经更新了我的问题。

3 个答案:

答案 0 :(得分:9)

b == a & b

检查ba是否包含相同的顺序。

换句话说:一般来说,你有B⊆A⇔B=A∩B。 Ruby的Array#&保留了左操作数的顺序。

答案 1 :(得分:2)

a = [1,2,3]
b = [2,1]

p a.each_cons(b.size).any?{|slice| slice == b} # => false

答案 2 :(得分:1)

给定两个数组arrsub,这是一种确定是否存在严格增加的索引数组indices的方法,以便arr.values_at(*indices) == sub。< / p>

def ordered?(arr, sub)
  sub.each do |c|
    i = arr.index(c)
    return false if i.nil?
    arr = arr[i+1..-1]
  end
  true
end

ordered?([1,2,3], [1,2])           #=> true
ordered?([1,2,3], [2,3])           #=> true
ordered?([1,2,3], [1,3])           #=> true
ordered?([1,2,3], [3,1])           #=> false
ordered?([1,2,5,2,4,3,4], [2,2,3]) #=> true

请注意@StefanPochmann在下面的评论中提出了一种更为紧凑的写法。