如何删除字符串数组中另一个字符串的所有子字符串?我想要这个字符串数组:
arr = ["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart", "Heesestr.", "Berl", "Berlin"]
缩小为:
["Bochum", "Stuttt", "Stuttgart", "Heesestr.", "Berlin"]
编辑:
arr
是唯一的,没有重复。答案 0 :(得分:2)
如果你不反对使用蛮力:
arr = ["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart",
"Heesestr.", "Berl", "Berlin"]
arr.each_with_object([]) { |str,a|
a << str unless arr.any? { |s| s.include?(str) && s.size > str.size } }
#=> ["Bochum", "Stuttt", "Stuttgart", "Heesestr.", "Berlin"]
答案 1 :(得分:0)
这是使用类似Trie的数据结构的实现。它通过简单地丢失信息来实现目标: - )
(我假设你只关心彼此的前缀的字符串,而不是子字符串......)
cdr
答案 2 :(得分:0)
不需要Rails,普通Ruby会这样做:
my_array =["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart", "Heesestr.", "Berl", "Berlin"]
my_array.keep_if {|x| my_array.join(",").scan(x).length == 1}
答案 3 :(得分:0)
不保留订单的解决方案:
["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart",
"Heesestr.", "Berlin", "Berl"].sort_by(&:size).reduce([]) do |ary, word|
ary.reject{|s| word.include?(s)}.push(word)
end
答案 4 :(得分:0)
假设您的数组元素始终以开头,则删除子字符串的一种方法是排序,这将首先放置较短的元素。然后,您可以拒绝在数组中更深匹配的元素。例如:
array = %w[Bochum Stu Stut Stuttt Stutt Stuttgart Heesestr. Berl Berlin]
array.sort.reject { |elem| array.grep(/\A#{elem}/).count > 1 }
#=> ["Berlin", "Bochum", "Heesestr.", "Stuttgart", "Stuttt"]
如果您的阵列不应该排序,那么这不是适合您的解决方案。但是,它肯定包含正确的数组元素,并且既简短又易于阅读。您的里程可能会有所不同。
答案 5 :(得分:0)
找到子字符串并删除它们,可能不是很好但很清楚
ar = ["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart", "Heesestr.", "Berl", "Berlin"]
sub_strings = []
ar.collect do |string|
for index in 0...string.length
sub_strings << string[0...index] if ar.include?(string[0...index])
end
end
results = ar - sub_strings