算法训练营day09|字符串|KMP算法,459重复的子字符串,双指针总结

1.知识点

KMP算法

2.刷题

28.找出字符串中第一个匹配项的下标

LeetCode链接 28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

题目描述

方法1:暴力枚举

package daimasuixiangshuati.day09_zifuchuan;

/**
 * @Author LeiGe
 * @Date 2023/10/22
 * @Description todo
 */
public class ZhaoChuZiFuChuanZhongDiYiGePiPeiXiangDeXiaBiao28_1 {
    /**
     * 方法1-双层循环:
     * 外层循环-原串的[发起点],
     * 内层循环-从原串的[发起点]和匹配串的[首位]开始,尝试匹配
     *
     * @param haystack
     * @param needle
     * @return
     */
    public static int strStr(String haystack, String needle) {
        int hLength = haystack.length();
        int nLength = needle.length();
        char[] hChars = haystack.toCharArray();
        char[] nChars = needle.toCharArray();

        //枚举原串的[发起点]
        for (int i = 0; i <= (hLength - nLength); i++) {
            //从原串的[发起点]和匹配串的[首位]开始,尝试匹配
            int a = i, b = 0;
            while (b < nLength && hChars[a] == nChars[b]) {
                a++;
                b++;
            }
            //如果能够完全匹配,返回原串的[发起点]
            if (b == nLength) {
                return i;
            }
        }
        return -1;
    }
}

时间复杂度:O(N^2)

空间复杂度:O(1)

方法2:KMP算法

459.重复的子字符串

LeetCode链接 459. 重复的子字符串 - 力扣(LeetCode)

题目描述

方法1:

3.小结

字符串系列

字符串系列可以分为3类问题

1.双指针

字符串的翻转可以通过首尾双指针实现,另外像数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

2.翻转

一些难以通过直接翻转得到结果的题目,可以尝试多次翻转,例如:先翻转整体,再翻转局部,先翻转前一部分,后翻转后部分等思路.

3.KMP算法

双指针系列

1.数组

数组中删除一个元素

2.字符串

替换字符串中的空格

花式反转字符串

3.链表

反转链表

链表寻找环入口:快慢指针

4.N数之和

三数之和,四数之和

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值