力扣面试150 找出字符串中第一个匹配项的下标 KMP 子串匹配
Problem: 28. 找出字符串中第一个匹配项的下标
时间复杂度: 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;
}
}
原文地址:https://blog.csdn.net/lt6666678/article/details/137889648
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!