344.反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0, j = s.size()-1;i < s.size()/2;i++,j--){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
};
541. 反转字符串II
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size();i += 2*k){
//如果剩余的字符数小于k,全部翻转
if(i + k > s.size()){
reverse(s.begin() + i,s.end());
}
//如果剩余字符数大于k,小于2k,翻转前k个
if(i + k <= s.size()){
reverse(s.begin() + i,s.begin() + i + k);
}
}
return s;
}
};
剑指Offer 05.替换空格
class Solution {
public:
string replaceSpace(string s) {
int count = 0;//计数器,找到有多少个“ ”
for(int i = 0; i < s.size(); i++){
if(s[i] == ' '){
count++;
}
}
int temp = s.size(); //记录原来数组的大小
s.resize(s.size() + 2*count); //重新申请数组大小
for(int i = temp - 1, j = s.size() - 1; i < j;i--,j--){
if(s[i] != ' '){
s[j] = s[i];
}
else{
s[j] = '0';
s[j-1] = '2';
s[j-2] = '%';
j -= 2;
}
}
return s;
}
};
151.翻转字符串里的单词
class Solution {
public:
//去掉多余的空格:
//空格出现的地方:开头、结尾、两个单词中间出现好几个空格
void removeExtraSpace(string& s){
//使用快慢指针
int slow = 0;
for(int fast = 0; fast < s.size(); fast++){
if(s[fast] != ' '){
if(slow != 0)s[slow++] = ' '; //如果慢指针不指向开头,那么加一个空格用于分隔单词
while(s[fast] != ' ' && fast < s.size()){
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
}
//翻转:1.整个字符串 2.单词翻转
void reserve(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) {
removeExtraSpace(s); //去掉多余的空格
reserve(s,0,s.size()-1);//翻转整个字符串
int temp = 0;//指向下一个要翻转的单词的开始位置
for(int i = 0;i <= s.size();++i){
//翻转单词
if(s[i] == ' ' || i == s.size()){
reserve(s,temp,i-1);
temp = i+1;
}
}
return s;
}
};
剑指Offer58-II.左旋转字符串
class Solution {
public:
string reverseLeftWords(string s, int n) {
//先进行整体翻转
reverse(s.begin(),s.end());
//翻转前s.size() - n
reverse(s.begin(),s.begin() + s.size() - n);
//翻转剩余字符
reverse(s.begin() + s.size() - n,s.end());
return s;
}
};