這道題目是比較經典的 \(kmp\) 模板,用乙個模式串匹配乙個文字串,輸出全部匹配的位置
首先考慮最暴力的做法:
我們從最開始的位置暴力匹配,如果成功,那麼就返回 \(i-j\) ,\(i\)是文字串當前的位置,\(j\)是模式串當前的位置
否則,我們就回溯到 \(i-j+1\),因為我們開始匹配的位置是 \(i-j\) ,那麼它的下一位就是 \(i-j+1\)
複雜度為 \(o(n^2)\)
我們可以發現,當我們在匹配的過程中,我們不一定要返回到 \(i-j+1\) 開始重新匹配,能不能只讓模式串動,而不讓文字串動呢?
答案是有的,這就要請到我們今天的主角: \(kmp\)
\(kmp\) 本質上的匹配是和暴力一樣的,只不過它加了乙個 \(next\) 陣列,從而優化了時間複雜度。
當\(i\) 和\(j\) 匹配時,那麼我們直接令 \(i++,j++\) ,但如果不匹配呢?
這時,我們就令 \(j=next[j]\) ,注:\(next[j]\) 表示的是
P3375 模板 KMP字串匹配
題目描述 如題,給出兩個字串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。為了減少騙分的情況,接下來還要輸出子串的字首陣列next。輸入輸出格式 輸入格式 第一行為乙個字串,即為s1 第二行為乙個字串,即為s2 輸出格式 若干行,每行包含乙個整數,表示s2在s1中出現的位置 接下...
P3375 模板 KMP字串匹配
如題,給出兩個字串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。為了減少騙分的情況,接下來還要輸出子串的字首陣列next。輸入格式 第一行為乙個字串,即為s1 第二行為乙個字串,即為s2 輸出格式 若干行,每行包含乙個整數,表示s2在s1中出現的位置 接下來1行,包括length...
P3375 模板 KMP字串匹配
這道題其實幾周前就已經切掉了,但是偶然間發現自己還沒發部落格,就來補一篇好了。kmp這個東西,網上講得太複雜,其實很簡單,也很容易解釋。就是分為兩部分 先維護next陣列 得先知道對next的定義吧?不知道可以上網查查 利用已經求好的next來計算。提醒一下,注意邊界判斷。不會的可以直接看我的 反正...