leetcode28. 实现 strStr(KMP详解)
生活随笔
收集整理的這篇文章主要介紹了
leetcode28. 实现 strStr(KMP详解)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:題目
二:思路
三:上碼
// class Solution { // public: // int strStr(string haystack, string needle) { // if (needle.size()==0) // return 0; // if (needle.size() > haystack.size()) // return -1; // int j=0;//用來指向needle的字符串 // int i=0; // for (i = 0; i < haystack.size(); i++) { // if (j==needle.size()){//如果已經(jīng)匹配完成則返回 // return i - needle.size(); // } // if (haystack[i] == needle[j]){ // j++; // } else{ // i -= j; // j=0; // } // } // //用來判斷單個(gè)字母的時(shí)候,j++之后j=1,i=1; // if (j==needle.size()){ // return i - needle.size(); // } // return -1; // } // };class Solution { public:void getNext(int* next,string s){//這里的是int i = 0;//表示前綴next[0] = 0;//一個(gè)字符的話公共前后綴肯定為0//j表示后綴for(int j = 1; j < s.size(); j++) {while(i > 0 && s[i] != s[j]) {//這里的i>0是為了保證i-1大于等于0i = next[i-1];//這里是往前推,也是相當(dāng)于匹配字符問題,將前一個(gè)字符所對(duì)應(yīng)的下標(biāo),賦值給i,// 然后字符串開始從i所對(duì)應(yīng)字符開始匹配}if(s[i] == s[j]) {i++;}next[j] = i; } }int strStr(string haystack, string needle) {/**思路:1.KMP算法,主要處理的是字符串匹配的問題2.這里邊需要用到next數(shù)組 也就是前綴表;那么我們?yōu)槭裁匆们熬Y表呢,當(dāng)我們進(jìn)行匹配字符的時(shí)候發(fā)現(xiàn)匹配到不相同的字符的時(shí)候,那么我們就需要在匹配字符串中查詢前一個(gè)字符所對(duì)應(yīng)的在前綴表表中的數(shù)值,根據(jù)數(shù)值找到對(duì)應(yīng)的字符 讓其重新作為匹配字符串的開始匹配的位置。3.那么我們?cè)趺辞笕∏熬Y表呢?首先先明白何為前綴、后綴、最長公共前后綴<1>:前綴:前綴是指不包含最后一個(gè)字符的所有以第一個(gè)字符開頭的連續(xù)子串eg:aabaaf其前綴可以是:aaaaabaabaaabaa<2>:后綴:后綴是指不包含第一個(gè)字符的所有以最后一個(gè)字符結(jié)尾的連續(xù)子串eg:aabaaf其后綴可以是:fafaafbaafabaaf<3>:最長公共前后綴:也就是給定一個(gè)字符串,我們找到其前綴和后綴相等的最長部分 eg:字符串 公共的部分 公共部分的長度a 0aa a 1 aab 0aaba a 1 aabaa aa 2aabaaf 0<4>:根據(jù)<3>求出的公共部分我們就可以求出next數(shù)組(前綴表)字符串: a a b a a f下 標(biāo): 0 1 2 3 4 5 next[]: 0 1 0 1 2 04.如何用next數(shù)組來進(jìn)行匹配呢?被匹配的字符串:aabaabaaf匹配的字符串:aabaaf當(dāng)匹配到f的時(shí)候發(fā)現(xiàn)f和b此時(shí)不匹配,那么我們就需要查詢匹配字符串的前一個(gè)字符所對(duì)應(yīng)的next數(shù)組中的數(shù)值,然后再從還數(shù)值所讀應(yīng)的字符開始匹配。回歸示例就是我們的f前面的字符a對(duì)應(yīng)的next數(shù)組中的數(shù)值是2,那么我們就從字符串的2位置對(duì)應(yīng)的字符開始匹配也就是b*/if(needle.size() == 0) {return 0;} int next[needle.size()]; getNext(next,needle);int j = 0;//代表被匹配的字符串for(int i = 0; i < haystack.size(); i++) {while(j > 0 && needle[j] != haystack[i]){j = next[j-1];}if(needle[j] == haystack[i]) {j++;}if(j == needle.size()){return (i-j+1);//可以類比hello 和 ll}}return -1;} };總結(jié)
以上是生活随笔為你收集整理的leetcode28. 实现 strStr(KMP详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YY语音游戏怎么充值?
- 下一篇: leetcode459. 重复的子字符串