每次循环左右指针往前挪2k步,判断右指针是否越界
code
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k){
int left=i;
int right=left+k-1;
if(right>=s.size()){
right=s.size()-1;
}
while(left<right){
swap(s[left],s[right]);
left++;
right--;
}
}
return s;
}
};
先将字符串扩充到替换之后的大小,从字符串尾部开始判断是移动还是替换
code
class Solution {
public:
string replaceSpace(string s) {
int num=0;
int Old_size=s.size();
for(int i=0;i<Old_size;i++){
if(s[i]==' '){
num++;
}
}
s.resize(s.size()+num*2);
int right=s.size()-1;
for(int left=Old_size-1;left<right;left--){
if(s[left]==' '){
s[right]='0';
s[right-1]='2';
s[right-2]='%';
right-=3;
}else{
s[right]=s[left];
right--;
}
}
return s;
}
};
首先删除多余空格,然后重新定义大小,先是反转整个字符串,再反转单词
code
class Solution {
public:
string reverseWords(string s) {
int index=0;
for(int i=0;i<s.size();i++){
while(i<s.size()&&s[i]==' '){
i++;
}
if(i==s.size()){
break;
}
if(index!=0&&s[i-1]==' '){
s[index]=' ';
index++;
}
s[index]=s[i];
index++;
}
s.resize(index);
cout<<s<<'/';
for(int left=0,right=s.size()-1;left<right;left++,right--){
swap(s[left],s[right]);
}
int next_left;
for(int left =0;left<index;left=next_left){
int right=left+1;
while(right<s.size()&&s[right]!=' '){
right++;
}
next_left=right+1;
for(;left<right;left++,right--){
swap(s[left],s[right-1]);
}
}
return s;
}
};
先扩充字符串长度+=n,将前n个元素复制到扩展的空间,再用s.substr(开始下标、长度)来截取字符串。
code
class Solution {
public:
string reverseLeftWords(string s, int n) {
int size=s.size();
s.resize(size+n);
for(int left=0,right=size;left<n;right++,left++){
s[right]= s[left];
}
return s.substr(n,size);
}
};
反转区间为前n的子串,再反转区间为n到末尾的子串,最后反转整个字符串
code
class Solution {
public:
string reverseLeftWords(string s, int n) {
int size=s.size();
for(int left=0,right=n-1;left<right;right--,left++){
swap(s[right],s[left]);
}
for(int left=n,right=size-1;left<right;right--,left++){
swap(s[right],s[left]);
}
for(int left=0,right=size-1;left<right;right--,left++){
swap(s[right],s[left]);
}
return s;
}
};
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;
}
};