题目链接:. - 力扣(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算法理论,对处理题上无从下手,二刷再回看
题目链接:. - 力扣(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循环的工作
三数之和,使用双指针法通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作,四数之和,其实思路是一样的,在三数之和的基础上再套一层for循环,依然是使用双指针法
学习了KMP算法的理论知识,回看总结了双指针法和字符串