当你将数组[index]设置为引号时,这意味着什么?

3
我一直在解决一个问题,即将一个字符串作为输入,如果存在重复的模式,则返回最长的重复模式。例如,如果字符串是"aabbbaa",则应返回"yes aa"。如果字符串是"aavbbbvaabbb",则应返回"yes 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上找到答案。非常感谢您的帮助! :)


1
你会删除在 idxidx2 之间的字符串内容,因此你将删除字符。 - Willem Van Onsem
1
答案在实例方法 String#[]= 的文档中给出。 - Cary Swoveland
"如何聪明地提问" 对你来说是很好的阅读材料。 - the Tin Man
1
你问题标题中的 array[index] 看起来有点误导,因为 copy 是一个字符串,而 idx..idx 是一个范围。 - Stefan
@Stefan 一个字符串在技术上被认为是一个数组,但你说得对,“index”也可以被写成“idx..idx”。然而,问题的主要目的是找出当您将其设置为“”时会发生什么,我的问题成功地在几秒钟内得到了答案。 - michaelthedeveloper
显示剩余4条评论
1个回答

5

字符串可以看作是一系列字符。通过以下方式进行编写:

copy[idx..idx2]=""

你正在将idxidx2之间的字符设置为空字符串,这意味着你正在从copy字符串中删除从idx(包括)到idx2(包括)的字符。
例如:
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"

1
啊,这样就解释清楚了。我现在明白了。感谢您的即时回复!! - michaelthedeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接