我想在字符串中找到最长的重复字符序列。
例如:
"aabbccc" #=> ccc
"aabbbddccdddd" #=> dddd
等
在第一个例子中,ccc是最长的序列,因为c重复3次。在第二个例子中,dddd是最长的序列,因为d重复了4次。
它应该是这样的:
b = []
a.scan(/(.)(.)(.)/) do |x,y,z|
b<<x<<y<<z if x==y && y==z
end
但是有一些标志可以保持重复次数,我想
答案 0 :(得分:6)
这应该有效:
string = 'aabbccc'
string.chars.chunk {|a| a}.max_by {|_, ary| ary.length}.last.join
|_, ary|
的解释:此时我们有2个元素数组的数组。我们只需要使用第二个,我们忽略第一个。相反,如果我们做|char, ary|
某些IDE会抱怨未使用的局部变量。放置_
告诉ruby忽略该值。
我们可以用正则表达式实现同样的目的:
string.scan(/([a-z])(\1*)/).map(&:join).max_by(&:length)
答案 1 :(得分:2)
以下是使用正则表达式的解决方案:
LETTER_MATCH = Regexp.new(('a'..'z').collect do |letter|
"#{letter}+"
end.join('|'))
def repeated(string)
string.scan(LETTER_MATCH).sort_by(&:length).last
end
答案 2 :(得分:0)
这是另一种解决方案。它更大但它仍然有效)
def most_friquent_char_in_a_row(my_str)
my_str = my_str.chars
temp=[]
ary=[]
for i in 0..my_str.count-1
if my_str[i]==my_str[i+1]
temp<<my_str[i] unless temp.include?(my_str[i])
temp<<my_str[i+1]
else
ary<<temp
temp=[]
end
end
result = ary.max_by(&:size).join
p "#{result} - #{result.size}"
end