目录
- leetcode 344.反转字符串
- 1、题目
- 2、思考
- leetcode 541. 反转字符串 II
- 1、题目
- 2、思考
leetcode 344.反转字符串
1、题目
2、思考
典型的双指针解法:
一个从前往后,一个从后往前,指针对应的交换即可。
class Solution {
public:void reverseString(vector<char>& s) {int start=0;int end=s.size()-1;if(end == -1) return ;while(start<=end){char tmp = s[start];s[start]=s[end];s[end] = tmp;start++;end--;}}
};
leetcode 541. 反转字符串 II
1、题目
2、思考
交换的基础部分还是和双指针有关,主要增加了逻辑上的复杂程度。
我的逻辑描述如下:
1、获取字符串长度(s_size )、并按照2k来划分组数(group_nums ),并且计算剩下来的不能组成一组的元素的个数(left_nums )
2、将翻转包装成函数,只要输入start 和end值即可
3、循环对组内的元素进行按照题目中的描述翻转,确定start 为该组第一个元素,end为start加上k,保证前k个元素翻转
4、对剩下的元素个数进行判断
5、如果剩余字符小于k个,start = (group_nums) * 2 * k,end为s最后一个字符
6、如果剩余字符小于2k个,start = (group_nums) * 2 * k,end=start+k
class Solution {
public:void myreverse(string& s, int start, int end){while (start <= end){char tmp = s[start];s[start] = s[end];s[end] = tmp;start++;end--;}}string reverseStr(string s, int k) {int s_size = s.size();int group_nums = s_size / (2 * k);int count = group_nums;int left_nums = s_size - 2 * k * group_nums;while (count > 0){int start = (count - 1) * 2 * k;int end = start + k - 1;myreverse(s, start, end);count--;}//剩下字符翻转if (left_nums < k){int start = (group_nums) * 2 * k;int end = s_size - 1;myreverse(s, start, end);}else if (left_nums < 2 * k){int start = (group_nums) * 2 * k;int end = start + k - 1;myreverse(s, start, end);}return s;}
};