和其他大佬一樣,先說一下暴力求解字串匹配問題,為什麼一定要說呢,因為kmp是根據暴力改進而來,理解了暴力後kmp就不難理解了。
比如從s中匹配p,(匹配就是查詢s中有沒有乙個子串等於p),給s串乙個i,p串乙個j,如果相同就均加一,如果不相等就把i回溯到開始的位置也就是i-j+1,然後把j歸0。並不難理解,接下來看**:
#include using namespace std;
int slove(string s, string p)
else //回溯操作
}if (j == p.size())
else }
int main()
else
return 0;
}
接下來通過看一下首先給出s和p:(即使理解了也看一下,因為我是想引出kmp)
進行第一次匹配,我們發現到d的時候無法匹配了:
這個時候 i 等於5, j 等於5,然後回溯,把 i 變為i-j+1,j = 0
然後就到了下面的:
我們發現第乙個就不相等,那就繼續回溯,這個時候i=1, j = 0,回溯就變成了i++;直到碰到下乙個a後:
然後給出p串的next陣列
這個陣列代表的意思是到當前位置得前一位最長的相同的字首和字尾長度是多少,一定要知道next裡面放的是前一位得最長相同字首和字尾字元的個數,通過上面兩個表理解。比如ababc, 對於第二個a就是0,b就是1。這有什麼用呢。這樣就能知道了當前s與p不匹配的時候最多能移動多長的長度,像ababc和abac匹配的時候,abac能知道我向後移動兩個就行,這樣就不會錯過和第乙個相等的字元了。
這個演算法時間複雜度為o(m+n),最壞的情況下是o(n)的時間複雜度。
具體實現**如下:
#include #include using namespace std;
const int max_n = 500001;
int next[max_n];
void getnext(string p)
else
}}int kmp(string s, string p)
else
}if (j == p.size())
else }
int main()
else
return 0;
}
JVM提問 個人筆記,不喜勿噴
新生代記憶體區域基本快滿了,再次分配物件的時候,發現空間不足 檢查老年代可用記憶體空間,是否大於新生代所有物件的總大小,如果大於新生代所有物件,就可以發起minor gc 老年代可用空間小於新生代的所有物件大小,檢查 xx handlepromotionfailure 的引數是否設定,如果設定了,就...
工作3年了,然後呢?(純個人看法,不喜勿噴)
工作快4年了,一直在寫 最近也離職了打算自己奮鬥一番事業,總結一下自己的工作經歷和經驗。時常總結自己,也是一種積累。我剛畢業進的是一家寫校園erp的公司,只幹了3個月因為拖欠工資就離職了。畢竟要生活,光讓馬兒跑不給馬兒吃草是不可能的。但是確實是學到了很多東西,加班多,學的知識也用於實踐了,邁出了程式...
程式設計師觀影有感 滾蛋吧,腫瘤君 不喜勿噴
感謝csdn這個對我來說超有感的平台,也許在別的平台像我這樣在技術類部落格上編寫日記般的部落格,早就給pass了,想想大家都是程式設計師,更懂得體諒別人了。昨天七夕呢,身為程式設計師,想啥呢,叫上另乙個程式設計師 男的 一起去電影院看 滾蛋吧腫瘤君 然後晚上就失眠了,晚上看完9 50,接著會實驗室,...