代码随想录算法训练营第9天 | 字符串总结 + 双指针回顾+初识KMP算法

本文介绍了如何使用KMP算法解决字符串问题strStr(),以及如何通过双指针法分析重复子字符串和在字符串处理中的应用,包括字符串查找和优化操作。作者强调了基础知识和自定义解决方案的重要性。
摘要由CSDN通过智能技术生成

今日任务

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

28. 实现 strStr(): 找出字符串中第一个匹配项的下标 - Medium

题目链接:. - 力扣(LeetCode)

    给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。

    示例 1:

    输入:haystack = "sadbutsad", needle = "sad"
    输出:0
    解释:"sad" 在下标 0 和 6 处匹配。
    第一个匹配项的下标是 0 ,所以返回 0 。
    示例 2:

    输入:haystack = "leetcode", needle = "leeto"
    输出:-1
    解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

一刷大致知道KMP算法理论,对处理题上无从下手,二刷再回看

459.重复的子字符串 - Easy

题目链接:. - 力扣(LeetCode)

    给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

    示例 1:

    输入: s = "abab"
    输出: true
    解释: 可由子串 "ab" 重复两次构成。
    示例 2:

    输入: s = "aba"
    输出: false
    示例 3:

    输入: s = "abcabcabcabc"
    输出: true
    解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

 同上,一刷暂且跳过

字符串总结

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组

打基础的时候,不要太迷恋于库函数

  • 如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数
  • 如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。

当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章 

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了 

  • KMP的精髓所在就是前缀表(前缀表:起始位置到下标i之前(包括i)的子串中,有多大长度的相同前缀后缀。)
  • 针对前缀表到底要不要减一,这其实是不同KMP实现的方式,其中主要理解j=next[x]这一步最为关键!

双指针法是字符串处理的常客

双指针回顾 

数组篇

原地移除数组上的元素,通过两个指针在一个for循环下完成两个for循环的工作

字符串篇

  • 反转字符串,使用双指针法,定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素
  • 替换空格 (opens new window) 中使用双指针填充字符串的方法,首先扩充数组到每个空格替换成"%20"之后的大小。然后双指针从后向前替换空格
  • 字符串:花式反转还不够!中,使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要删除冗余空格。在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定

链表篇

  • 使用双指针法来翻转链表,只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表
  • 在链表中求环,使用快慢指针(双指针法),分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环

N数之和篇 

三数之和,使用双指针法通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作,四数之和,其实思路是一样的,在三数之和的基础上再套一层for循环,依然是使用双指针法

今日总结

学习了KMP算法的理论知识,回看总结了双指针法和字符串

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值