我一直在研究一个问题,目标是采用字符串并在存在模式的情况下返回最长的重复模式。例如,如果字符串是“ aabbbaa”,则将返回“ yes aa”。如果字符串是“ aavbbbvaabbb”,则将返回“是bbb”。我看了看别人的解决方案,并相信除了这一行似乎很关键以外,还要理解每段代码:copy[idx..idx2]=""
这是整个解决方案:
def PatternChaser(str)
patterns = {}
(0..str.length-1).each do |idx|
(idx + 1..str.length - 1).each do |idx2|
copy = str.dup
chunk = str[idx..idx2]
len = chunk.length
copy[idx..idx2] = ""
patterns[chunk] = len if copy.include?(chunk) && !patterns.include?(chunk)
end
end
return "no null" if patterns.empty?
patterns.each { |k,v| return "yes" + " " + k if v == patterns.values.max }
end
puts PatternChaser(STDIN.gets)
如果这是相当普遍的语法,请原谅我。到目前为止,我已经进行了不到一年的编码,到目前为止,在StackOverflow上还找不到答案。帮助将不胜感激! :)
最佳答案
字符串可以看作是字符序列。通过写:
copy[idx..idx2]=""
您正在将
idx
和idx2
之间的字符设置为空字符串,这意味着您要从idx
字符串中的idx2
(包括)和copy
(包括)中删除字符。例如:
irb(main):001:0> s = "foobar"
=> "foobar"
irb(main):002:0> s[1..3] = ""
=> ""
irb(main):003:0> s
=> "far"
我们还可以插入另一个字符串,该字符串包含比该序列更少,相等或更多的字符。例如:
irb(main):007:0> s = "foobar"
=> "foobar"
irb(main):008:0> s[1..3] = "oofoob"
=> "oofoob"
irb(main):009:0> s
=> "foofoobar"