28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
典型的kmp板子题,详细解答可以看我KMP相关帖子。
class Solution {
public:
int strStr(string s, string p) {
int n = s.size(), m = p.size();
s = ' '+s,p = ' '+p;//处理一下,让s和p串从下标1开始
vector<int> next(m + 1);//这个也是从下标1开始 同时next[1]默认0
//先求一下p数组的next数组
for(int i = 2,j = 0;i <=m;i ++) {
while(j && p[i] != p[j+1]) j = next[j];
if(p[i] == p[j+1]) j++;
next[i] = j;
}
//开始匹配
for(int i = 1,j = 0;i <= n;i ++) {
while(j && s[i] !=p[j+1]) j = next[j];
if(s[i] == p[j+1]) j++;
if(j == m) return i-m;//本来是i-m+1 但是我们的下标在一开始处理了一下,往右边移动了一位,i-m+1的基础上还要减1
}
return -1;
}
};