28. Find the Index of the First Occurrence in a String
题目链接:28. 实现 strStr()
思路链接:代码随想录字符串-实现 strStr()
思路
KMP算法:首先初始化前缀表next,这里可以是加1或者不加1甚至是减1的前缀表;然后开始构造前缀表next,先处理前缀末尾和后缀末尾不相等的情况,再处理前缀末尾和后缀末尾相等的情况。构造完毕前缀表之后利用前缀表匹配字符串。一旦某个字符匹配不上,needle上的指针就根据前一个字符对应的前缀表的值回跳到相应的位置。注意构造处理前缀表时的细节很重要,也很难懂,一刷就大概了解一下,二刷的时候再仔细理解。
心路历程
KMP算法挺难的,到现在还是比较懵懂的状态,到二刷的时候要死磕一下。459那道题没写跳过了。
Code
class Solution {
// 1.初始化前缀表next,这里用的是不加减1的前缀表
// 2.处理前缀末尾和后缀末尾不相等的情况
// 3.处理前缀末尾和后缀末尾相等的情况
// 4.利用前缀表匹配字符串
public int strStr(String haystack, String needle) {
if (needle.length() == 0) {return 0;}
int[] next = new int[needle.length()];
getNext(next, needle);
int j = 0;
for (int i = 0; i < haystack.length(); i++) {
while (j > 0 && needle.charAt(j) != haystack.charAt(i)) {
j = next[j - 1];
}
if (needle.charAt(j) == haystack.charAt(i)) {
j++;
}
if (j == needle.length()) {
return i - needle.length() + 1;
}
}
return -1;
}
private void getNext(int[] next, String needle) {
// 初始化前缀表
int j = 0;
next[0] = 0;
for (int i = 1; i < needle.length(); i++) {
// 不相等的情况
while (j > 0 && needle.charAt(i) != needle.charAt(j)) {
j = next[j - 1];
}
// 相等的情况
if (needle.charAt(i) == needle.charAt(j)) {
j++;
}
next[i] = j;
}
}
}
字符串总结
比较简单,看一下代码随想录
代码随想录字符串总结
总结
- 双指针法:经常会用于字符串题目中
- 基本的反转方法有temp赋值和位运算法
- 很多题目有比较多的细节,需要比较好的代码实现能力
双指针回顾
代码随想录双指针法总结
主要题目涉及到有数组、链表、字符串、N数之和。
今天又思考了一遍随想录中涉及到双指针的题目,还行