国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

武漢網(wǎng)站制作公司郴州網(wǎng)站定制

武漢網(wǎng)站制作公司,郴州網(wǎng)站定制,網(wǎng)站內(nèi)容專題怎么做,辦營業(yè)執(zhí)照要多少錢目錄: 解題及思路學(xué)習(xí) 28. 實現(xiàn) strStr() https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/ 給你兩個字符串 haystack 和 needle ,請你在 haystack 字符串中找出 needle 字符串的第一個匹配項的下標(biāo)(下…

目錄:

解題及思路學(xué)習(xí)

28.?實現(xiàn)?strStr()

https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/

給你兩個字符串?haystack?和?needle?,請你在?haystack?字符串中找出?needle?字符串的第一個匹配項的下標(biāo)(下標(biāo)從 0 開始)。如果?needle?不是?haystack?的一部分,則返回??-1?****。

示例 1:

輸入:haystack = "sadbutsad", needle = "sad"
輸出:0
解釋:"sad" 在下標(biāo) 0 和 6 處匹配。
第一個匹配項的下標(biāo)是 0 ,所以返回 0 。

思考:字符串匹配,可以直接暴力方法。但是這題肯定是kmp算法。

前綴表:前綴表是用來回退的,它記錄了模式串與主串(文本串)不匹配的時候,模式串應(yīng)該從哪里開始重新匹配。

使用前綴表,就不會從頭匹配,而是從上次已經(jīng)匹配的內(nèi)容開始匹配,找到了模式串中第三個字符b繼續(xù)開始匹配。

**前綴表是如何記錄的呢?**什么是前綴表:記錄下標(biāo)i之前(包括i)的字符串中,有多大長度的相同前綴后綴。

前綴是指不包含最后一個字符的所有以第一個字符開頭的連續(xù)子串

后綴是指不包含第一個字符的所有以最后一個字符結(jié)尾的連續(xù)子串。

前綴表要求的就是相同前后綴的長度。

所以字符串a(chǎn)的最長相等前后綴為0。 字符串a(chǎn)a的最長相等前后綴為1。 字符串a(chǎn)aa的最長相等前后綴為2。 等等…。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pXWB2jJR-1691982232460)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0577fe82-fba0-498e-8995-e7eca0fbc040/Untitled.png)]

前綴表可以告訴我們匹配失敗之后跳到哪里重新開始匹配。

下標(biāo)5之前這部分的字符串(也就是字符串a(chǎn)abaa)的最長相等的前綴 和 后綴字符串是 子字符串a(chǎn)a ,因為找到了最長相等的前綴和后綴,匹配失敗的位置是后綴子串的后面,那么我們找到與其相同的前綴的后面重新匹配就可以了。

如何計算前綴表

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mC760OQe-1691982232464)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/87bd2181-9cb1-4836-ad3f-6a2dd4a50f59/Untitled.png)]

可以看出模式串與前綴表對應(yīng)位置的數(shù)字表示的就是:下標(biāo)i之前(包括i)的字符串中,有多大長度的相同前綴后綴。

KMP算法的時間復(fù)雜度是O(n+m)的。暴力的解法顯而易見是O(n × m),所以KMP在字符串匹配中極大地提高了搜索的效率。

構(gòu)造next數(shù)組

構(gòu)造next數(shù)組其實就是計算模式串s,前綴表的過程。?主要有如下三步:

  1. 初始化
  2. 處理前后綴不相同的情況
  3. 處理前后綴相同的情況

前綴表統(tǒng)一減一的操作

class Solution {
public:void getNext(int* next, const string& s) {int j = -1;next[0] = j;for(int i = 1; i < s.size(); i++) { // 注意i從1開始while (j >= 0 && s[i] != s[j + 1]) { // 前后綴不相同了j = next[j]; // 向前回退}if (s[i] == s[j + 1]) { // 找到相同的前后綴j++;}next[i] = j; // 將j(前綴的長度)賦給next[i]}}int strStr(string haystack, string needle) {if (needle.size() == 0) {return 0;}int next[needle.size()];getNext(next, needle);int j = -1; // // 因為next數(shù)組里記錄的起始位置為-1for (int i = 0; i < haystack.size(); i++) { // 注意i就從0開始while(j >= 0 && haystack[i] != needle[j + 1]) { // 不匹配j = next[j]; // j 尋找之前匹配的位置}if (haystack[i] == needle[j + 1]) { // 匹配,j和i同時向后移動j++; // i的增加在for循環(huán)里}if (j == (needle.size() - 1) ) { // 文本串s里出現(xiàn)了模式串treturn (i - needle.size() + 1);}}return -1;}
};
  • 時間復(fù)雜度: O(n + m)
  • 空間復(fù)雜度: O(m), 只需要保存字符串needle的前綴表

前綴表(不減一)C++實現(xiàn)

i表示后綴末尾,ji傲視前綴末尾。

class Solution {
public:void getNext(int* next, const string& s) {int j = 0;next[0] = 0;for(int i = 1; i < s.size(); i++) {while (j > 0 && s[i] != s[j]) {j = next[j - 1];}if (s[i] == s[j]) {j++;}next[i] = j;}}int strStr(string haystack, string needle) {if (needle.size() == 0) {return 0;}int next[needle.size()];getNext(next, needle);int j = 0;//使用next數(shù)據(jù),將haystack與needle進行匹配。for (int i = 0; i < haystack.size(); i++) {while(j > 0 && haystack[i] != needle[j]) {j = next[j - 1];}if (haystack[i] == needle[j]) {j++;}if (j == needle.size() ) {  // 文本串s里出現(xiàn)了模式串treturn (i - needle.size() + 1);}}return -1;}
};
  • 時間復(fù)雜度: O(n + m)
  • 空間復(fù)雜度: O(m)

多自己寫幾遍,就會理解的更深一點。

459.重復(fù)的子字符串

https://leetcode.cn/problems/repeated-substring-pattern/

給定一個非空的字符串?s?,檢查是否可以通過由它的一個子串重復(fù)多次構(gòu)成。

示例 1:

輸入: s = "abab"
輸出: true
解釋: 可由子串 "ab" 重復(fù)兩次構(gòu)成。

思考:最多由一半的子串組成。利用kmp算法不斷找最小重復(fù)子串。

隨想錄:判斷字符串s是否由重復(fù)子串組成,只要兩個s拼接在一起,里面還出現(xiàn)一個s的話,就說明是由重復(fù)子串組成。當(dāng)然,我們在判斷 s + s 拼接的字符串里是否出現(xiàn)一個s的的時候,要刨除 s + s 的首字符和尾字符,這樣避免在s+s中搜索出原來的s,我們要搜索的是中間拼接出來的s。

class Solution {
public:bool repeatedSubstringPattern(string s) {string t = s + s;t.erase(t.begin());t.erase(t.end() - 1);if (t.find(s) != std::string::npos) return true;return false;}          
};
  • 時間復(fù)雜度: O(n)
  • 空間復(fù)雜度: O(1)

kmp思路:

最長相等前后綴不包含的子串就是最小重復(fù)子串

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7OWiy2H8-1691982232465)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/df6b2f6b-6ed3-441d-9fee-ffe8dbba32ff/Untitled.png)]

數(shù)組長度減去最長相同前后綴的長度相當(dāng)于是第一個周期的長度,也就是一個周期的長度,如果這個周期可以被整除,就說明整個數(shù)組就是這個周期的循環(huán)。

class Solution {
public:void getNext (int* next, const string& s){next[0] = 0;int j = 0;for(int i = 1;i < s.size(); i++){while(j > 0 && s[i] != s[j]) {j = next[j - 1];}if(s[i] == s[j]) {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] != 0 && len % (len - (next[len - 1] )) == 0) {return true;}return false;}
};
  • 時間復(fù)雜度: O(n)
  • 空間復(fù)雜度: O(n)

字符串總結(jié)

1、C語言中,已結(jié)束符’\0’ 判斷字符串是否結(jié)束。C++中,提供一個string類,string類會提供 size接口,可以用來判斷string類字符串是否結(jié)束,就不用’\0’來判斷是否結(jié)束。

2、那么vector< char > 和 string 又有什么區(qū)別呢?其實在基本操作上沒有區(qū)別,但是 string提供更多的字符串處理的相關(guān)接口,例如string 重載了+,而vector卻沒有。所以想處理字符串,我們還是會定義一個string類型。

3、打基礎(chǔ)的時候,不要太迷戀于庫函數(shù)。

4、雙指針法在數(shù)組,鏈表和字符串中很常用。其實很多數(shù)組填充類的問題,都可以先預(yù)先給數(shù)組擴容帶填充后的大小,然后在從后向前進行操作。

5、KMP的主要思想是當(dāng)出現(xiàn)字符串不匹配時,可以知道一部分之前已經(jīng)匹配的文本內(nèi)容,可以利用這些信息避免從頭再去做匹配了。

復(fù)盤總結(jié)

個人反思

字符串類類型的題目,往往想法比較簡單,但是實現(xiàn)起來并不容易,復(fù)雜的字符串題目非常考驗對代碼的掌控能力。

雙指針法是字符串處理的常客。

KMP算法是字符串查找最重要的算法

http://aloenet.com.cn/news/42675.html

相關(guān)文章:

  • 浙江網(wǎng)站建設(shè)情況應(yīng)用商店關(guān)鍵詞優(yōu)化
  • 網(wǎng)站怎么做盈利萬網(wǎng)域名注冊查詢
  • 怎樣做網(wǎng)絡(luò)推廣軟件系統(tǒng)惠州seo排名
  • 換模板搭建網(wǎng)站怎么做百度競價排名收費標(biāo)準(zhǔn)
  • 某互聯(lián)網(wǎng)公司觸屏網(wǎng)站開網(wǎng)店怎么推廣運營
  • 做企業(yè)網(wǎng)站用哪個軟件產(chǎn)品推廣平臺排行榜
  • 1個ip可以做幾個網(wǎng)站學(xué)企業(yè)管理培訓(xùn)班
  • 有專門為個人網(wǎng)站做推廣的嗎網(wǎng)站搜索排名優(yōu)化價格
  • 盤錦網(wǎng)站建設(shè)多少錢合肥網(wǎng)站優(yōu)化軟件
  • 東莞哪家網(wǎng)站建設(shè)專業(yè)網(wǎng)絡(luò)營銷推廣計劃書
  • 上海手機網(wǎng)站建設(shè)電話咨詢免費二級域名注冊網(wǎng)站有哪些
  • 西部數(shù)碼網(wǎng)站管理助手 破解版seo查詢seo優(yōu)化
  • 赤峰微網(wǎng)站建設(shè)廈門關(guān)鍵詞優(yōu)化企業(yè)
  • 專業(yè)定制網(wǎng)站制作公司百度廣告怎么投放多少錢
  • jquery 的網(wǎng)站模板下載地址今天的新聞最新消息
  • 學(xué)院網(wǎng)站建設(shè)規(guī)劃網(wǎng)絡(luò)服務(wù)是什么
  • ecs搭建多個wordpress南寧seo主管
  • 自制網(wǎng)站地圖怎么做品牌策劃書
  • 社區(qū)網(wǎng)站如何做內(nèi)容運營全網(wǎng)推廣費用
  • 大理微網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣公司簡介
  • 網(wǎng)站做抽獎活動快排seo排名軟件
  • 駐馬店市網(wǎng)站建設(shè)外貿(mào)網(wǎng)站推廣
  • 長春做網(wǎng)站新格公司南京seo
  • 正宗營銷型網(wǎng)站建設(shè)網(wǎng)頁一鍵生成app軟件
  • app網(wǎng)站制作下載網(wǎng)站推廣和優(yōu)化系統(tǒng)
  • 安徽設(shè)計網(wǎng)站建設(shè)南寧百度推廣seo
  • 投資網(wǎng)站網(wǎng)站源碼談?wù)勀銓ヂ?lián)網(wǎng)營銷的認(rèn)識
  • 視頻網(wǎng)站建設(shè)公司廣告引流推廣平臺
  • 電商設(shè)計網(wǎng)站模板合肥優(yōu)化推廣公司
  • 網(wǎng)站常用特效國家職業(yè)技能培訓(xùn)官網(wǎng)