刷题第九天 | 28. 实现 strStr()、字符串总结、双指针回顾

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;
        }
    }
}

字符串总结

比较简单,看一下代码随想录
代码随想录字符串总结

总结

  1. 双指针法:经常会用于字符串题目中
  2. 基本的反转方法有temp赋值和位运算法
  3. 很多题目有比较多的细节,需要比较好的代码实现能力

双指针回顾

代码随想录双指针法总结
主要题目涉及到有数组、链表、字符串、N数之和。
今天又思考了一遍随想录中涉及到双指针的题目,还行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值