考虑一组字符串如下:
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,但是如何将其扩展到匹配括号?
答案 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)"