系列文章目录
字符串相关
前言
现代C++,多用std::string
344.反转字符串 easy pass
541.反转字符串II
建立在翻转字符串基础上,先对反转的情况做好分类。
剑指Offer05.替换空格
扩展字符串与扩展数组一样。
1、确定新长度
2、扩充数组
3、从后向前遍历操作
151.翻转字符串里的单词
思路:
- 移除多余空格(快慢指针,先移除队首,队中,队尾)
- 将整个字符串反转(滑动窗口)
- 将每个单词反转
剑指Offer58-II.左旋转字符串
反转反转再反转
KMP算法
计算前缀表:
如何计算前缀表
接下来就要说一说怎么计算前缀表。
如图:
长度为前1个字符的子串a,最长相同前后缀的长度为0。(注意字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。)
长度为前2个字符的子串aa,最长相同前后缀的长度为1。
长度为前3个字符的子串aab,最长相同前后缀的长度为0。
以此类推: 长度为前4个字符的子串aaba,最长相同前后缀的长度为1。 长度为前5个字符的子串aabaa,最长相同前后缀的长度为2。 长度为前6个字符的子串aabaaf,最长相同前后缀的长度为0。
那么把求得的最长相同前后缀的长度就是对应前缀表的元素,如图:
可以看出模式串与前缀表对应位置的数字表示的就是:下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。
//计算前缀表
void getNext(int* next , string& s){
//1.初始化
int left =0 , right=1;
next[0]=0;
for(;right<s.size() ;right++){
//不匹配
while(left>0 && s[left]!=s[right]){
left = next[left-1];
}
//匹配上
if(s[left]==s[right]){
left++;
}
next[right] = left;
}
}