一、LeetCode 344.反转字符串
题目链接:344. Reverse String - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:
1、双指针
代码
class Solution {
public:
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size() - 1; i < j; ++i, --j) {
swap(s[i], s[j]);
}
}
};
复杂度分析
时间复杂度:O(N),其中 N 为字符数组的长度。一共执行了 N/2 次的交换。
空间复杂度:O(1)。
二、LeetCode 541. 反转字符串II
题目链接:541. Reverse String II - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:
1、模拟
代码
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
// 1. 每隔 2k 个字符的前 k 个字符进行反转
for (int i = 0; i < n; i += 2 * k) {
if (i + k <= n) {
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
reverse(s.begin() + i, s.begin() + i + k);
} else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
复杂度分析
- 时间复杂度: O(n)
- 空间复杂度: O(1)
三、LeetCode 剑指Offer 05.替换空格
题目链接:LCR 122. 路径加密 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:
1、双指针法
代码
class Solution {
public:
string replaceSpace(string s) {
int count = 0; // 统计空格的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
s.resize(s.size() + count * 2); // 这里乘以2是因为"%20"占3个字符,原来的空格占1个字符
int sNewSize = s.size();
// 从后先前将空格替换为"%20"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] != ' ') {
s[i] = s[j];
} else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
四、LeetCode 151.翻转字符串里的单词
题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:
代码
复杂度分析
五、LeetCode 剑指Offer58-II.左旋转字符串
题目链接:LCR 182. 动态口令 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解: