在ruby

时间:2016-03-02 00:01:01

标签: ruby string pattern-matching

考虑一组字符串如下:

aa(bb(c)dd)
aeeff(bb(cd)eee)
(bb(c)dd)(bb(cd(eee

即使最长的重复非重叠子字符串是(bb(cd)eee(10个字符),具有匹配括号的最长重复子字符串(bb(c)ee)(9个字符)。

我可以轻松地find the longest non-overlapping repeated substring,但是如何将其扩展到匹配括号?

1 个答案:

答案 0 :(得分:2)

据我了解,您希望单行中的最长字符串以"("开头,以")"结尾并包含“平衡括号”。另外,子字符串是一个“重复”子字符串,但尚未定义,因此我忽略了该要求。

balanced_parens?(下方)来自我的回答here

def longest_balanced(str)
  str.lines.map { |s| longest_by_line(s.chomp) }.max_by(&:size)
end 

def longest_by_line(str)
  str.size.downto(1).find do |n|
    str.each_char.each_cons(n) do |a|
      s = a.join
      return s if (s =~ /\A\(.*\)\z/)  && balanced_parens?(s)
    end
  end
  nil
end

def balanced_parens?(str)
  pstr = str.gsub(/[^()]/,"")
  while pstr.gsub!("()", "")
  end
  pstr.empty?
end

str =<<_
aa(bb(c)dd)
aeeff(bb(cd)eee)
(bb(c)dd)(bb(cd(eee
_

longest_balanced str
  #=> "(bb(cd)eee)"