讀完題馬上想到 kmp,但需要有一些變化。
容易發現兩段單詞可以匹配當且僅當它們出現的相對順序相同,如 a a b a b c
和 x x y x y z
,因此可以想到將每個單詞用它本次出現的位置與上次出現位置的差來記錄它,若第一次出現則記為 inf,如 a a b a b c
可以改寫成 inf 1 inf 2 2 inf
。
但是此時如果直接跑普通 kmp 會出現一個問題,如果文字串中這段單詞中有一個在整段前出現過,而模式串中對應的單詞第一次出現,就會判為不匹配,但有可能是匹配的,例如 c (a a b a b c) d
和 x x y x y z
,可以發現括號中的部分和模式串是匹配的。因此需要在 kmp 時判一下這種匹配的情況,即如果模式串中該單詞第一次出現,且文字串中對應單詞上次出現的位置在整段前,則也能匹配。