344. 反转字符串
题解
- 定义两个指针,一个从字符串开头,一个从字符串结尾,同时向中间移动;
- swap(s[i],s[j]);
代码
双指针法
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0,j=s.size()-1; i<s.size()/2; i++,j--){
swap(s[i],s[j]);
}
}
};
541. 反转字符串II
题解
- 遍历字符串过程中,i += 2*k,i每次移动2k;
- 如果i+k<=s.size(),翻转然后continue;
- 否则就是剩下的字符个数不够k个,翻转剩下的字符串;
代码
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0; i<s.size(); i+=2*k){
if(i+k <= s.size()){
reverse(s.begin()+i,s.begin()+i+k);
continue;
}
reverse(s.begin()+i,s.end());
}
return s;
}
};
剑指 Offer 05. 替换空格
题解
- 首先按照需求扩充s的大小;
- 用双指针法从后向前填充元素,替换空格;
- i:新长度的尾部,j:旧长度的尾部;
代码
双指针法
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
for(int i=0; i<s.size(); i++){
if(s[i] == ' ') count++;
}
int olds = s.size();
s.resize(olds+2*count);
int news = s.size();
for(int i=news-1, j=olds-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;
}
};
剑指 Offer 58 - II. 左旋转字符串
题解
- 局部反转+整体反转;
- 反转区间为前n的子串,反转剩余子串;
- 整体反转;
代码
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;
}
};
151. 反转字符串中的单词
题解
- 删除所有空格,并在单词之间添加一个空格(双指针),slow的值就是s的大小;
- 整体翻转字符串后翻转每个单词;
翻转的条件有两个:
1.s[i]为空格的时候;
2.i为最后一个元素索引+1的时候,即i==s.size();
代码
双指针法
class Solution {
public:
string reverseWords(string s) {
// 删除所有的空格 并在单词之间添加一个空格
int slow = 0;
for(int fast=0; fast<s.size(); fast++){
if(s[fast] != ' '){
if(slow != 0) s[slow++] = ' ';
while(fast<s.size() && s[fast] != ' '){
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
// 翻转字符串
reverse(s.begin(), s.end());
// 翻转每个单词
int start = 0;
for(int i=0; i<=s.size(); i++){
if(s[i] == ' ' || i == s.size()){
reverse(s.begin()+start, s.begin()+i);
start = i+1;
}
}
return s;
}
};