代码随想录算法训练营第九天| 28. 实现 strStr() 459.重复的子字符串 字符串总结 双指针回顾

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:针对很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容