Day 9 | 字符串 28. 实现 strStr() 、459.重复的子字符串 、字符串总结 、双指针回顾

本文介绍了如何使用KMP算法解决字符串`strStr()`问题,包括构建next数组以及检查重复子字符串模式。通过`Solution`类展示了如何在`haystack`中查找`needle`的出现位置,同时提及了与双指针方法的结合应用。
摘要由CSDN通过智能技术生成

28. 实现 strStr()

题目
文章讲解
视频讲解
视频讲解2

思路:KMP 算法解决字符串匹配问题:前缀表和next数组


class Solution {
    public int strStr(String haystack, String needle) {
        if(needle.length()==0){
            return 0; // 如果needle为空字符串,则返回0
        }

        int[] next = new int[needle.length()];
        getNext(next,needle); // 获取next数组
        int j=-1;
        for(int i=0;i<haystack.length();i++){
            while(j>=0&&haystack.charAt(i)!=needle.charAt(j+1)){
                j=next[j]; // 根据next数组更新j的值
            }
            if(haystack.charAt(i)==needle.charAt(j+1)){
                j++; // 如果匹配成功,j加1
            }
            if(j==needle.length()-1){
                return (i-needle.length()+1); // 如果j等于needle的长度-1,表示匹配成功,返回起始位置
            }
        }
        return -1; // 如果遍历完haystack仍未找到匹配的子串,返回-1
    }
    public void getNext(int[] next,String s){
        int j=-1;
        next[0]=j; // 初始化next数组
        for(int i=1;i<s.length();i++){
            while(j>=0&&s.charAt(i)!=s.charAt(j+1)){
                j=next[j]; // 根据next数组更新j的值
            }
            if(s.charAt(i)==s.charAt(j+1)){
                j++; // 如果匹配成功,j加1
            }
            next[i]=j; // 更新next数组的值
        }
    }
}

459.重复的子字符串(本题可以跳过)

题目
文章讲解
视频讲解

注意空字符是“ ”,不是“”

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        if (s.equals(""))  // 如果输入字符串为空,则返回 false
            return false;
        int len = s.length();  // 获取字符串的长度
        s = " " + s;  // 在原始字符串前面添加一个空格,使得下标从1开始
        char[] chars = s.toCharArray();  // 将字符串转换为字符数组
        int[] next = new int[len + 1];  // 创建 next 数组,长度为 len + 1
        for (int i = 2, j = 0; i <= len; i++) {  // 开始构造 next 数组,i 从 2 开始
            while (j > 0 && chars[i] != chars[j + 1])  // 使用 KMP 算法构造 next 数组
                j = next[j];
            if (chars[i] == chars[j + 1])  // 如果匹配成功,j 往后移
                j++;
            next[i] = j;  // 更新 next 数组的值
        }
        if (next[len] > 0 && len % (len - next[len]) == 0) {  // 判断是否是重复的子字符串
            return true;  // 如果是,则返回 true
        }
        return false;  // 否则返回 false
    }
}

符串总结

文章讲解
字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定

双指针回顾

文章讲解
通过两个指针在一个for循环下完成两个for循环的工作

有时字符串可以和双指针配合使用
都需要再看

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向大蒜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值