👩🏫 三叶题解
时间复杂度: O ( n + m ) O(n+m) O(n+m)
空间复杂度: O ( m ) O(m) O(m)
💖 Code
class Solution {
// ss 原串
// pp 匹配串(pattern)
public int strStr(String ss, String pp) {
if(pp.isEmpty()) return 0;
int n = ss.length();
int m = pp.length();
// 前置加空格 使得真正的串下标从 1 开始
ss = " " + ss;
pp = " " + pp;
char[] s = ss.toCharArray();
char[] p = pp.toCharArray();
// next数组 与匹配串相关
int[] next = new int[m + 1];//next[i] 表示与当前后缀匹配的最长前缀的末尾元素的下标
for(int i = 2, j = 0; i <= m; i++)
{
while(j > 0 && 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 > 0 && s[i] != p[j+1])
j = next[j];
if(s[i] == p[j+1]) j++;
if(j == m) return i-m;
}
return -1;
}
}