找到字符串中最长的子字符串

时间:2014-08-07 19:59:51

标签: ruby

我想在字符串中找到最长的重复字符序列。

例如:

"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

但是有一些标志可以保持重复次数,我想

3 个答案:

答案 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