目录



leetcode 344.反转字符串

1、题目

leetcode 344. 反转字符串 541. 反转字符串 II 双指针解_leetcode

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、题目

leetcode 344. 反转字符串 541. 反转字符串 II 双指针解_数据结构_02

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;
}
};