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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

不瞞你說,重復子串問題,KMP很拿手

題目459.重復的子字符串

給定一個非空的字符串,判斷它是否可以由它的一個子串重復多次構成。給定的字符串只含有小寫英文字母,并且長度不超過10000。

示例 1:
輸入: "abab"
輸出: True
解釋: 可由子字符串 "ab" 重復兩次構成。

示例 2:
輸入: "aba"
輸出: False

示例 3:
輸入: "abcabcabcabc"
輸出: True
解釋: 可由子字符串 "abc" 重復四次構成。(或者子字符串 "abcabc" 重復兩次構成。)

思路

這又是一道標準的KMP的題目。

我們在字符串:都來看看KMP的看家本領!里提到了,在一個串中查找是否出現過另一個串,這是KMP的看家本領。

那么尋找重復子串怎么也涉及到KMP算法了呢?

這里就要說一說next數組了,next 數組記錄的就是最長相同前后綴( 字符串:聽說你對KMP有這些疑問? 這里介紹了什么是前綴,什么是后綴,什么又是最長相同前后綴), 如果 next[len - 1] != -1,則說明字符串有最長相同的前后綴(就是字符串里的前綴子串和后綴子串相同的最長長度)。

最長相等前后綴的長度為:next[len - 1] + 1。

數組長度為:len。

如果len % (len - (next[len - 1] + 1)) == 0 ,則說明 (數組長度-最長相等前后綴的長度) 正好可以被 數組的長度整除,說明有該字符串有重復的子字符串。

「強烈建議大家把next數組打印出來,看看next數組里的規律,有助于理解KMP算法」

如圖:

此時next[len - 1] = 7,next[len - 1] + 1 = 8,8就是此時 字符串asdfasdfasdf的最長相同前后綴的長度。

(len - (next[len - 1] + 1)) 也就是:12(字符串的長度) - 8(最長公共前后綴的長度) = 4, 4正好可以被 12(字符串的長度) 整除,所以說明有重復的子字符串(asdf)。

代碼如下:

C++代碼

class Solution { public:// KMP里標準構建next數組的過程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;} };

拓展

此時我們已經分享了三篇KMP的文章,首先是字符串:KMP是時候上場了(一文讀懂系列)講解KMP算法的基礎理論,給出next數組究竟是如何來了,前綴表又是怎么回事,為什么要選擇前綴表。

然后通過字符串:都來看看KMP的看家本領!講解一道KMP的經典題目,判斷文本串里是否出現過模式串,這里涉及到構造next數組的代碼實現,以及使用next數組完成模式串與文本串的匹配過程。

后來很多同學反饋說:搞不懂前后綴,什么又是最長相同前后綴(最長公共前后綴我認為這個用詞不準確),以及為什么前綴表要統一減一(右移)呢,不減一行不行?針對這些問題,我在字符串:聽說你對KMP有這些疑問?中又給出了詳細的講解。

本文:

https://github.com/youngyangyang04/leetcode-master?github.com

已經收錄,里面還有leetcode刷題攻略、各個類型經典題目刷題順序、思維導圖,可以fork到自己倉庫,有空看一看一定會有所收獲,如果對你有幫助也給一個star支持一下吧! 我的B站(里面有我講解的算法視頻已經編程相關知識):

嗶哩嗶哩 ( ゜- ゜)つロ 乾杯~ Bilibili?space.bilibili.com我是程序員Carl,哈工大師兄,先后在騰訊和百度從事技術研發多年,利用工作之余重刷leetcode,更多精彩算法文章盡在:代碼隨想錄,關注后,回復「Java」「C++」「python」「簡歷模板」等等,有我整理多年的學習資料,可以加我微信,備注「個人簡介」+「組隊刷題」,拉你進入刷題群(無任何廣告,純個人分享),每天一道經典題目分析,我選的每一道題目都不是孤立的,而是由淺入深一脈相承的,如果跟住節奏每篇連續著看,定會融會貫通。

總結

以上是生活随笔為你收集整理的js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。