日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!

發(fā)布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

不瞞你說,重復(fù)子串問題,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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。