Что это значит, когда вы устанавливаете массив [индекс] равным кавычкам? - PullRequest
3 голосов
/ 17 февраля 2020

Я работал над проблемой, где цель состоит в том, чтобы взять строку и вернуть самый длинный повторяющийся шаблон, если шаблон присутствует. Например, если строка «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 Ответ

5 голосов
/ 17 февраля 2020

Строка может рассматриваться как последовательность символов. Написав:

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