反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int left=0,right=s.size()-1;
char temp;
while(right>=left){
temp=s[right];
s[right]=s[left];
s[left]=temp;
right--;
left++;
}
return;
}
};
反转字符串II
class Solution {
public:
void reverse(string&s,int l,int r){
for(int i=l,j=r;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=(k*2)){
if(i+k<s.size()){
reverse(s,i,i+k-1);
}
else
reverse(s,i,s.size()-1);
}
return s;
}
};
替换空格
剑指 Offer 05. 替换空格 - 力扣(Leetcode)
class Solution {
public:
string replaceSpace(string s) {
int count=0;
int sLenth=s.size();
for(int i=0;i<s.size();i++){
if(s[i]==' ') count+=2;
}
s.resize(s.size()+count);
for(int i=sLenth-1,j=s.size()-1;j>i;i--,j--){
if(s[i]!=' '){
s[j]=s[i];
}
else{
s[j]='0';
s[j-1]='2';
s[j-2]='%';
j-=2;
}
}
return s;
}
};
其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
翻转字符串里的单词
class Solution {
public:
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);
}
void reverse(int left,int right,string& s){
for(int i=left,j=right;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(0,s.size()-1,s);
int start=0;
for(int i=0;i<=s.size();++i){
if(i==s.size()||s[i]==' '){
reverse(start,i-1,s);
start=i+1;
}
}
return s;
}
};
左旋转字符串
剑指 Offer 58 - II. 左旋转字符串 - 力扣(Leetcode)
class Solution {
public:
void reverse(int l,int r,string& s){
for(int i=l,j=r;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseLeftWords(string s, int n) {
reverse(0,n-1,s);
reverse(n,s.size()-1,s);
reverse(0,s.size()-1,s);
return s;
}
};