目录
前言
记录一下自己刷代码随想录的过程,希望能坚持下去,思路、代码均来自于代码随想录。
KMP算法目前还没有特别弄懂,等彻底想明白了再整理上来。
1.反转字符串Ⅱ
题目:给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
For循环,每次循环i移动2*k步,判断需要反转的区间(反转前k,或全部反转)。反转函数可用双指针实现。
2.替换空格
题目:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
不使用额外空间
首先扩充数组到每个空格替换成“%20”之后的大小;
然后从后向前替换空格,也就是双指针法,i指向新长度的末尾,j指向旧长度的末尾。
其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
3.翻转字符串里的单词
题目:给定一个字符串,逐个翻转字符串中的每个单词。
示例:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 移除多余空格 : "hello world!"
- 字符串反转:"!dlrow olleh"
- 单词反转:"world! hello"
移除多余空格时可用双指针操作,参考移除数组重复元素。
4.左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
不能申请额外空间,只能在本串上操作
局部反转+整体反转
1.反转区间为前n的子串
2.反转区间为n到末尾的子串
3.反转整个字符串
KMP算法
总结
双指针——反转——KMP