【问题标题】:Find longest repeated substring with matched parentheses in ruby在ruby中查找具有匹配括号的最长重复子字符串
【发布时间】:2016-06-14 15:29:16
【问题描述】:

考虑如下一组字符串:

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,但是如何将其扩展到匹配的括号?

【问题讨论】:

  • 什么是“重复子串”?
  • 什么是“重复子串”?问题不清楚。
  • @sawa 这确实是谷歌上的第一个结果wikiwand.com/en/Longest_repeated_substring_problem
  • 在什么意义上(bb(cd)eee定义后的重复子串?
  • 它出现在第 2 行和第 3 行中。

标签: ruby string pattern-matching


【解决方案1】:

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

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)"

【讨论】:

  • 这可以很容易地与问题中提到的最长重复子字符串函数相结合,所以即使它没有完全回答问题,我也接受。
  • 我不知何故错过了问题中的链接。在那个链接上,原始问题有this link。我仍然不清楚什么构成“重复子串”以及它的长度。对于“banana”,是重复的子串“an”(长度为 2)或“anan”(长度为 4)。例如,如果我们比较“banananana”和“booboo”,就会有所不同。此外,我假设“banana)”将被跳过,但“(bananana)”将是一个候选者。正确的?一旦我知道我很乐意修改我的答案。正如你所说,这应该很简单。
  • 对于“banana”,最长不重叠的子串是“an”(长度为 2)。
  • 所以“重复”意味着连续重复一次或多次。 “bananananan”包含两个重复的子串,“an”和“anan”,“dogdogdog”和“catscats”中的LRS是“cats”。对吗?
  • 无需连续重复。他们可以以任何顺序重复。但是,是的,这些是您给出的示例的正确答案。
猜你喜欢
  • 2020-08-11
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2015-01-02
  • 1970-01-01
  • 2021-08-02
  • 2014-06-26
相关资源
最近更新 更多