比较两个字符串并匹配它们,无论顺序如何

时间:2017-07-20 18:45:25

标签: ruby

给出以下数组:

@array = ["012", "345", "678", "048", "246", "036", "147", "258"]

我怎样才能检查变量@register中的3位是否与数组中的3位数相匹配而不关心所述3位数的顺序?

即。 [sic] @register的值为"012""210""102""246""174"会产生true,但"014""247"不会。

3 个答案:

答案 0 :(得分:2)

require 'set'

def is_present?(array, register)
  array.map { |s| s.chars.to_set }.include?(register.chars.to_set)
end

array = ["012", "345", "678", "048", "246", "036", "147", "258"]
["012", "210", "102", "246", "174", "014", "247"].each { |s|
  puts "#{s} => #{is_present?(array, s)}" }
012 => true
210 => true
102 => true
246 => true
174 => true
014 => false
247 => false

如果(与OP的示例不同)前导零可以在register的值或array的元素中省略(例如,s = "12"而不是{{1使用零填充字符串以使它们全部为三个字符是明智的:

s = "012"

答案 1 :(得分:1)

可能效率远低于其他答案,但在这里使用Array#permutation似乎很有语义,所以:

def any_perm? str, arr
  arr.any? { |e| e.chars.permutation(3).include? str.chars }
end

array = ["012", "345", "678", "048", "246", "036", "147", "258"]

any_perm? "210", array #=> true
any_perm? "102", array #=> true
any_perm? "012", array #=> true
any_perm? "852", array #=> true

any_perm? "111", array #=> false
any_perm? "259", array #=> false

显然,如果您愿意,可以推广方法中的3

答案 2 :(得分:0)

给出两个值数组,例如:

a = %w[ 012 345 678 ]
b = %w[ 345 678 123 ]
c = %w[ 000 111 123 ]

然后,您可以使用Array#&方法计算交叉点:

a & b
# => ["345", "678"] 
a & c
# => []
b & c
# => ["123"]

您还可以快速测试任何重叠:

(a & b).any?
# => true
(a & c).any?
# => false
(b & c).any?
# => true