leetcode 541. Reverse String II
关键在于理清各种情况
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
int cnt=0;
for(int i=0;i<n;i++){
cnt++;
if( cnt == 2*k){
reverse(s.begin()+i-cnt+1, s.begin()+i-cnt+1+k);
cnt=0;
}else if(i==n-1){
if(cnt<=k){
reverse(s.begin()+i-cnt+1, s.end());
}else{
reverse(s.begin()+i-cnt+1, s.begin()+i-cnt+1+k);
}
}
}
return s;
}
};
leetcode 151. Reverse Words in a String
这个题复杂一些。因为还要把多余的空格删掉。
class Solution {
public:
void reverseWords(string &s) {
// 先翻转每个单词
int n= s.length();
int i=0,j=0, start;
for(;i<n;i++){
while(i<n && s[i]==' ')
i++; // 找到非空的单词开头
if(i<n && j!=0){
s[j++]=' ';
}
start = j;
while(i<n && s[i]!=' ')
s[j++]=s[i++];
reverse(s.begin()+start, s.begin()+j);
}
s.resize(j);
reverse(s.begin(),s.end());
// 后 翻转整体
}
};
leetcode 557. Reverse Words in a String III
这道题简单在每个单词之间只有一个空格,并且首尾没有多余的空格。
class Solution {
public:
string reverseWords(string s) {
int n = s.length();
int start=0;
for(int i=0;i<n;i++){
if(s[i]!=' '){
;
}else{
reverse(s.begin()+start, s.begin()+i);
start = i+1;
}
}
reverse(s.begin()+start, s.end());
return s;
}
};
扩展:
当空格数不确定的时候呢?那么需要考虑从非空格的起始点和非空格的终点进行reverse。
class Solution {
public:
string reverseWords(string s) {
int n = s.length();
bool flag = false;
int start;
for(int i=0;i<n;i++){
if(flag == false){ // 还没有找到非空格的起点
if(s[i]!=' '){
start = i;
flag = true;
}
}else{
if(s[i]==' '){
reverse(s.begin()+start,s.begin()+i);
flag = false;
}else if(i==n-1){
reverse(s.begin()+start, s.end());
}
}
}
return s;
}
};