1. 541 反转字符串 II 简单
1. 题目详情
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
1. 原题链接
2. 题目要求
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:
输入:s = “abcd”, k = 2
输出:“bacd”
提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104
3. 基础框架
● Cpp代码框架
class Solution {
public:
string reverseStr(string s, int k) {
};
2. 解题思路
1. 思路分析
(
1
)
(1)
(1) 一个变量
s
t
a
r
t
start
start记录需要逆置的部分的起始下标;
(
2
)
(2)
(2) 计算从
s
t
a
r
t
start
start下标开始剩余的字符数量
n
u
m
num
num,对
n
u
m
num
num进行判断;
(
3
)
(3)
(3)
n
u
m
num
num 大于等于
2
∗
k
2*k
2∗k ,则逆置从
s
t
a
r
t
start
start开始的前
k
k
k个字符,start更新加上
2
∗
k
2*k
2∗k;
(
4
)
(4)
(4)
n
u
m
num
num 小于
2
∗
k
2*k
2∗k但大于等于
k
k
k,则逆置从
s
t
a
r
t
start
start开始的前
k
k
k个字符,此时是最后一次逆置,
s
t
a
r
t
start
start更新为整个字符串的大小;
(
5
)
(5)
(5)
n
u
m
num
num小于
k
k
k,则逆置从
s
t
a
r
t
start
start开始的剩余字符,此时是最后一次逆置,
s
t
a
r
t
start
start更新为整个字符串的大小;
2. 时间复杂度
O
(
N
/
k
)
O(N/k)
O(N/k)
每次处理
2
∗
k
2*k
2∗k个字符,长度为n的字符串处理
n
/
(
2
∗
k
)
+
1
n/(2*k) + 1
n/(2∗k)+1次;
3. 代码实现
class Solution {
public:
string reverseStr(string s, int k) {
// [0, 2k-1]
// [2k, 4k-1]
// [4k, 6k-1]
// ...
// start
int start = 0;
while(start < s.size()){
if(s.size() - start >= 2 * k){
reverse(s.begin() + start, s.begin() + start + k);
start += 2 * k;
}
else if(s.size() - start >= k){
reverse(s.begin() + start, s.begin() + start + k);
start = s.size();
}
else{
reverse(s.begin() + start, s.end());
start = s.size();
}
}
return s;
}
};