344.反转字符串
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解题思路:
- 双指针,一个指最左边,一个指最右边
- 每次交换指针所指的两个值,并将两个指针进行向内缩进
- 一直执行到s.size()/2的位置
代码:
class Solution {
public:
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size()-1; i < s.size()/2; i++, j--){
char temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
};
541. 反转字符串II
题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解题思路:
使用内置的反转函数,然后根据题意模拟
代码:
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= s.size()) {
reverse(s.begin() + i, s.begin() + i + k );
} else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
剑指Offer 05.替换空格
题目简介:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
解题思路:
- 扩充字符串至替换后的大小
- 指针1指向原字符的末尾,指针2指向扩充后字符串的末尾
- 向左遍历并填充元素,如果遇到空格则替换为%20
代码:
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);
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;
}
};
151.翻转字符串里的单词
题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
求解思路:
- 去掉多余空格
- 翻转整个字符串
- 翻转每个单词
代码:
class Solution {
public:
// 去掉多余空格
void deleteTheSpace(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);
}
// 翻转字符串
void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
string reverseWords(string s) {
deleteTheSpace(s); //去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。
reverse(s, 0, s.size() - 1);
int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是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;
}
};
剑指Offer58-II.左旋转字符串
题目简介:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
求解思路:
代码:
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};