541. 反轉字符串 II
給定一個字符串和一個整數 k,你需要對從字符串開頭算起的每個 2k 個字符的前k個字符進行反轉。如果剩餘少於 k 個字符,則將剩餘的所有全部反轉。如果有小於 2k 但大於或等於 k 個字符,則反轉前 k 個字符,並將剩餘的字符保持原樣。
示例:
輸入: s = "abcdefg", k = 2 輸出: "bacdfeg"要求:
- 該字符串只包含小寫的英文字母。
- 給定字符串的長度和 k 在[1, 10000]範圍內。
解法一
//時間複雜度O(n), 空間複雜度O(1)
class Solution {
public:
string reverseStr(string s, int k) {
int idx = 0;
while(idx < s.size()) {
int i = idx;
int j = idx + k - 1 < s.size() ? idx + k - 1 : s.size() - 1;
for(; i < j; i++, j--) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
idx += 2 * k;
}
return s;
}
};
解法一
雙指針法:
- 指針 i,j 分別指向子串的頭和尾,負責交換要反轉的子串。i 每次初始化爲idx,j 如果超過了原字符串的右邊界,則初始化爲指向最後一個元素,否則它指向idx + k - 1;
- idx負責找到第2k個位置,每次向後移動2k,直到idx超出右邊界。