代码随想录算法训练营第9天 | 28.实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾
28.实现strStr()
题目
![LeetCode-28](2023-02-23T100435.png)
给定字符串A和B,返回B作为子串在A中出现的位置。
自己的想法
暴力法就不说了,时间复杂度\(O(m * n)\)。
优化方法是使用KMP算法来进行字符串匹配,可惜考研的时候只在王道上学了KMP怎么样手工计算next数组,代码莫得掌握。
KMP太长了,感觉自己讲不明白,详细的说明可以去看上面代码随想录的链接。这里只说明一下KMP的思想就是:字符串某个位置出现不匹配的时候,可以不用从头开始匹配,直接根据next数组跳转至已经匹配过得一部分。
题解
1 |
|
459.重复的子字符串
题目
![LeetCode-459](2023-02-23T101606.png)
判断一个字符串是否由一个子串多次重复构成。
自己的想法
暴力法
其实也可以用KMP算法来解决,如果一个字符串是由其子串多次重复而得到的,其next数组就会呈现出一定的规律。
假设重复n次来组成的串s的子串为sub,长为x, 那么s的长度为\(m * x\),且s的最长相同前后缀长度必定为 \((m - 1) * x\),通过这个条件,就可以根据next数组判断是否满足题设。
题解
1 |
|
字符串总结
字符串,其实可以看做是字符的数组。在C++中,字符串可以是
1
2
3
4
5char a[5] = "asd";
\\ 也可以是
vector<char> vc;
\\ 还可以是
string s;
使用char的数组来组成一个字符串,需要自行判断'\0‘来检测字符串的结尾,string则不用,且string类型提供了更多的接口来进行字符串处理。所以在遇到字符串问题的时候,尽量还是使用string类型。
双指针法
和数组中的双指针法非常相似,无论是翻转,还是去除某些元素。
例题:
反转题目
这类题目涉及到对于字符串的翻转操作,按照要求完成一部分翻转或者是某个区间的翻转。
例题:
KMP
两个字符串进行匹配,思想是匹配过程中出现不相同字符时,使用预先计算好的内容,避免从头开始重新进行匹配。
例题:
双指针回顾
双指针主要是用于将暴力法(通常情况下)的\(O(n^2)\)的时间复杂度给降低下来,使用两个指针在一个for循环下完成两个嵌套for循环的工作。
字符串
主要涉及原地翻转,去除给定字符操作。(其实在数组里也是这些)
例题:
链表
还是反转,反转链表;以及环形结构的问题。
例题:
N数之和
例题:
代码随想录算法训练营第9天 | 28.实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾