Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ
目录
(一)反转字符串Ⅱ的C++实现
写法一(s.begin()遍历字符)
(二)复杂度分析
时间复杂度
空间复杂度
(三)总结
【题目链接】541. 反转字符串Ⅱ - 力扣(LeetCode)
给定一个字符串
s
和一个整数k
,从字符串开头算起,每计数至2k
个字符,就反转这2k
字符中的前k
个字符。
如果剩余字符少于
k
个,则将剩余字符全部反转。如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"示例 2:
输入:s = "abcd", k = 2
输出:"bacd"提示:
1 <= s.length <= 104
s
仅由小写英文组成
1 <= k <= 104
(一)反转字符串Ⅱ的C++实现
写法一(s.begin()遍历字符)
解题思路:
本题的反转与上一题不同,【题目链接】344.反转字符串 - 力扣(LeetCode)Leetcode刷题 由浅入深之字符串——344. 反转字符串-CSDN博客这一题是将整个字符串逆序,本题是在字符串内部2k以内逆序。
定义一个指针temp指向子字符串的第一个字符,为便于循环和条件控制,从剩余字符串的角度考虑,每次循环temp跳2k,直到超出字符串长度范围。根据题意,
-
如果剩余字符少于
k
个,则将剩余字符全部反转。 -
如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
使用s.begin()表示字符串的第一个字符,通过加减整数代表字符串的第几个字符。使用reverse()函数对子字符串进行反转。根据题目要求写出不同条件的处理办法即可。
class Solution {
public:string reverseStr(string s, int k) {int a = s.size();int temp = 0;while(temp < a){if(a-temp < k){reverse(s.begin()+temp, s.begin()+a);}else if(a-temp >= k && a-temp < 2*k){reverse(s.begin()+temp, s.begin()+temp+k);}else{reverse(s.begin()+temp, s.begin()+temp+k);}temp += 2*k;}return s; }
};
思路理清楚之后,会发现可以将一些逻辑相同的部分合并起来,更简洁的代码如下,运行结果一致。
class Solution {
public:string reverseStr(string s, int k) {int a = s.size();int temp = 0;while(temp < a){/*if(a-temp < k)reverse(s.begin()+temp, s.begin()+a);else if(a-temp >= k && a-temp < 2*k)reverse(s.begin()+temp, s.begin()+temp+k);elsereverse(s.begin()+temp, s.begin()+temp+k);*/reverse(s.begin()+temp, s.begin()+min(temp+k, a));temp += 2*k;}return s; }
};
(二)复杂度分析
时间复杂度
空间复杂度
(三)总结
(1)s.begin()表示字符串的第一个字符,后面加减整数可以遍历字符串中的字符。
(2)reverse()函数可以对子字符串进行反转。
学习中,诚挚希望有心者指正和交流,经验或者方法都可。