Я думаю, вы понимаете большинство из них,
так что давайте перейдем к другому базовому примеру.
ampleex
itsalreadyhereexample
exam
Допустим, B - example
, а A - одно из перечисленных.
Для первого случая A.length () == B.length ()
мы проверяем, является ли это подстрокой, и получаем нет как ответ.
Поэтому мы добавляем его еще раз и получаем «ampleexampleex»
и теперь мы получаем результат, в котором A содержит B.
Для второго случая A.length ()> B.length ()
мы проверяем, является ли она подстрокой, и получаем результат, в котором A содержит B.
(Если его здесь не будет, нам все еще нужно проверить, не повторяется ли его,
что эквивалентно первому случаю)
Для третьего случая A.length ()
поэтому мы повторяем это, пока не охватим длину B
и получите examexam
.
Мы видим, что его там нет, поэтому добавим еще раз,
и его до сих пор нет (examexamexam
).
Причина, по которой мы должны это сделать, заключается в том, что это может быть более особый случай.
B может быть что-то вроде xamexame
- в основном, повторение
одного из вариантов As.
(Возможные варианты в этом случае будут повторениями xame
, amex
, mexa
.)
В этом случае он должен быть в повторной форме, которая длиннее, чем B,
отсюда и q + 1.
Давайте посмотрим на повторения более подробно:
Длина B может быть не более (A.length () * q) + x, где x равно [0, A.length].
A = exam
B = xame[xame]
B по-прежнему является повторением A, но каждый символ в последней повторении является необязательным.
examexam
xame
xamex
xamexa
xamexam
examexamexam
xamexame
Добавление еще одного exam
к S, ничего не изменит, так как мы уже рассмотрели все возможности (с этого момента новый шаблон не появится).
Если его там нет, это не может быть повторением. Другие сценарии - где
это может быть подстрока - были охвачены первым и вторым случаем.
Надеюсь, этот пример поможет вам избавиться от путаницы.
Если нет, просто спросите, что вы не понимаете.