28. 实现 strStr()
#1 自己看到题目的第一想法
暴力解法。时间复杂度为n*m
#2 看完代码随想录之后的想法
KMP算了先不看了
459.重复的子字符串
#1 自己看到题目的第一想法
暴力,时间复杂度o(n*n)
#2 看完代码随想录之后的想法
所以判断字符串s是否有重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是又重复子串组成。
当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。
- 暴力解法是m * n,一般库函数实现为 O(m + n)
如果我们做过 28.实现strStr (opens new window)题目的话,其实就知道,实现一个 高效的算法来判断 一个字符串中是否出现另一个字符串是很复杂的,这里就涉及到了KMP算法。
KMP先不看啦
#3 收获
在做判断字符串s是否有重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是又重复子串组成
字符串总结
双指针法:左右指针以及快慢指针,同时还有sliding window。
反转系列:主要就是 while (l < r) [s[l], s[r]] = [s[r], s[l]] l++ r--
移除元素:主要就是加一个index,通过index++与否来在原字符上进行覆盖 (数组上的元素,不能真正的删除,只能覆盖),最后再重新修改字符串的长度以删减不需要的部分
KMP算法是字符串查找最重要的算法,通过减少已经check过的substring来降低时间复杂度。
双指针回顾
双指针来提高效率,一般是将O(n^2)的时间复杂度,降为O(n)。
n数之和是双指针的经典题目。
note:针对很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。