js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!
題目459.重復(fù)的子字符串
給定一個非空的字符串,判斷它是否可以由它的一個子串重復(fù)多次構(gòu)成。給定的字符串只含有小寫英文字母,并且長度不超過10000。
示例 1:
輸入: "abab"
輸出: True
解釋: 可由子字符串 "ab" 重復(fù)兩次構(gòu)成。
示例 2:
輸入: "aba"
輸出: False
示例 3:
輸入: "abcabcabcabc"
輸出: True
解釋: 可由子字符串 "abc" 重復(fù)四次構(gòu)成。(或者子字符串 "abcabc" 重復(fù)兩次構(gòu)成。)
思路
這又是一道標(biāo)準(zhǔn)的KMP的題目。
我們在字符串:都來看看KMP的看家本領(lǐng)!里提到了,在一個串中查找是否出現(xiàn)過另一個串,這是KMP的看家本領(lǐng)。
那么尋找重復(fù)子串怎么也涉及到KMP算法了呢?
這里就要說一說next數(shù)組了,next 數(shù)組記錄的就是最長相同前后綴( 字符串:聽說你對KMP有這些疑問? 這里介紹了什么是前綴,什么是后綴,什么又是最長相同前后綴), 如果 next[len - 1] != -1,則說明字符串有最長相同的前后綴(就是字符串里的前綴子串和后綴子串相同的最長長度)。
最長相等前后綴的長度為:next[len - 1] + 1。
數(shù)組長度為:len。
如果len % (len - (next[len - 1] + 1)) == 0 ,則說明 (數(shù)組長度-最長相等前后綴的長度) 正好可以被 數(shù)組的長度整除,說明有該字符串有重復(fù)的子字符串。
「強烈建議大家把next數(shù)組打印出來,看看next數(shù)組里的規(guī)律,有助于理解KMP算法」
如圖:
此時next[len - 1] = 7,next[len - 1] + 1 = 8,8就是此時 字符串a(chǎn)sdfasdfasdf的最長相同前后綴的長度。
(len - (next[len - 1] + 1)) 也就是:12(字符串的長度) - 8(最長公共前后綴的長度) = 4, 4正好可以被 12(字符串的長度) 整除,所以說明有重復(fù)的子字符串(asdf)。
代碼如下:
C++代碼
class Solution { public:// KMP里標(biāo)準(zhǔn)構(gòu)建next數(shù)組的過程void getNext (int* next, const string& s){next[0] = -1;int j = -1;for(int i = 1;i < s.size(); i++){while(j >= 0 && s[i] != s[j+1]) {j = next[j];}if(s[i] == s[j+1]) {j++;}next[i] = j;}}bool repeatedSubstringPattern (string s) {if (s.size() == 0) {return false;}int next[s.size()];getNext(next, s);int len = s.size();if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {return true;}return false;} };拓展
此時我們已經(jīng)分享了三篇KMP的文章,首先是字符串:KMP是時候上場了(一文讀懂系列)講解KMP算法的基礎(chǔ)理論,給出next數(shù)組究竟是如何來了,前綴表又是怎么回事,為什么要選擇前綴表。
然后通過字符串:都來看看KMP的看家本領(lǐng)!講解一道KMP的經(jīng)典題目,判斷文本串里是否出現(xiàn)過模式串,這里涉及到構(gòu)造next數(shù)組的代碼實現(xiàn),以及使用next數(shù)組完成模式串與文本串的匹配過程。
后來很多同學(xué)反饋說:搞不懂前后綴,什么又是最長相同前后綴(最長公共前后綴我認(rèn)為這個用詞不準(zhǔn)確),以及為什么前綴表要統(tǒng)一減一(右移)呢,不減一行不行?針對這些問題,我在字符串:聽說你對KMP有這些疑問?中又給出了詳細(xì)的講解。
本文:
https://github.com/youngyangyang04/leetcode-master?github.com已經(jīng)收錄,里面還有l(wèi)eetcode刷題攻略、各個類型經(jīng)典題目刷題順序、思維導(dǎo)圖,可以fork到自己倉庫,有空看一看一定會有所收獲,如果對你有幫助也給一個star支持一下吧! 我的B站(里面有我講解的算法視頻已經(jīng)編程相關(guān)知識):
嗶哩嗶哩 ( ゜- ゜)つロ 乾杯~ Bilibili?space.bilibili.com我是程序員Carl,哈工大師兄,先后在騰訊和百度從事技術(shù)研發(fā)多年,利用工作之余重刷leetcode,更多精彩算法文章盡在:代碼隨想錄,關(guān)注后,回復(fù)「Java」「C++」「python」「簡歷模板」等等,有我整理多年的學(xué)習(xí)資料,可以加我微信,備注「個人簡介」+「組隊刷題」,拉你進入刷題群(無任何廣告,純個人分享),每天一道經(jīng)典題目分析,我選的每一道題目都不是孤立的,而是由淺入深一脈相承的,如果跟住節(jié)奏每篇連續(xù)著看,定會融會貫通。總結(jié)
以上是生活随笔為你收集整理的js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 登录牵手_Java: Http
- 下一篇: ab753变频器参数怎么拷贝到面板_变频