LeetCode344 反转字符串
题目链接:反转字符串
思路
使用双指针,从字符串两边向中间一直做交换操作即可。此题关于库函数的使用原则可见文章
代码
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0, j = s.size() - 1;
while (i < j) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
};
复杂度
时间复杂度O(n)
空间复杂度O(1)
Leetcode541 反转字符串II
题目链接:反转字符串II
思路
按照题目要求模拟行为进行反转即可,本题用到了reverse库函数,也可以自己写。
代码
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (k * 2)) {
if (i + k <= s.size()) { //反转前k个
reverse(s.begin() + i, s.begin() + i + k);
} else { //反转剩余全部
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
复杂度
时间复杂度O(n)
空间复杂度O(1)
卡码网54 替换数字
题目链接:替换数字
思路
①利用resize将数组扩展到数字替换成number之后的大小;②使用双指针从后向前替换数字字符(从后向前时间复杂度更低,详见文章);③输出替换后的字符串。
代码
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int count = 0;
int OldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9')
count++;
}
s.resize(s.size() + count * 5);
int NewSize = s.size();
for (int i = NewSize - 1, j = OldSize - 1; j >= 0; i--, j--) {
if (s[j] > '9' || s[j] < '0')
s[i] = s[j];
else {
s[i] = 'r';
s[i - 1] = 'e';
s[i - 2] = 'b';
s[i - 3] = 'm';
s[i - 4] = 'u';
s[i - 5] = 'n';
i -= 5;
}
}
cout << s << endl;
}
}
复杂度
时间复杂度O(n)
空间复杂度O(1)
Leetcode151 反转字符串里的单词
题目链接:反转字符串中的单词
思路
①移除多余的空格;②将整个字符串反转;③将每个单词反转
代码
class Solution {
public:
void reverse(string& s, int start, int end) { //翻转,区间写法:左闭右闭 []
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeExtraSpaces(
string& s) { //去除所有空格并在相邻单词之间添加空格, 快慢指针。
int slow = 0;
for (int i = 0; i < s.size(); ++i) { //
if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
if (slow != 0)
s[slow++] = ' '; //手动控制空格,给单词之间添加空格。
while (i < s.size() && s[i] != ' ') { //遇到空格说明单词结束。
s[slow++] = s[i++];
}
}
}
s.resize(slow); // slow的大小即为去除多余空格后的大小。
}
string reverseWords(string s) {
removeExtraSpaces(s); //去除多余空格
reverse(s, 0, s.size() - 1);
int start = 0;
for (int i = 0; i <= s.size(); ++i) {
if (i == s.size() || s[i] == ' ') { //到达空格或者串尾
reverse(s, start, i - 1);
start = i + 1; //更新start
}
}
return s;
}
};
复杂度
时间复杂度O(n)
空间复杂度O(1)
卡码网55 右旋转字符串
题目链接:右旋转字符串
思路
三次逆置的思想:①先将字符串整体逆置;②再将前k个字符逆置;③最后将后n-k个字符逆置,即得到右旋转的效果。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int k;
string s;
cin >> k;
cin >> s;
int len = s.size(); //获取长度
reverse(s.begin(), s.end()); // 整体反转
reverse(s.begin(), s.begin() + k); // 反转前一段
reverse(s.begin() + k, s.end()); // 反转后一段
cout << s << endl;
}
复杂度
时间复杂度O(n)
空间复杂度O(1)