输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路
先把整个字符串反转,然后挨个单词反转,再处理空格。
代码
class Solution {
public:
void reverse(string& s,int left,int right) {
while(left < right) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
string reverseWords(string s) {
int len = s.length();
reverse(s,0,len-1);
int left = 0,right=0;
for(int i = 0;i < len;i++) {
if(s[i] == ' ') {
right = i-1;
reverse(s,left,right);
left = i+1;
}
else if(i == len-1) {
reverse(s,left,i);
}
}
//处理空格
string ans;
bool preHasSpace = false;
bool hasAl = false;
for(int i = 0;i < len;i++) {
if(s[i] != ' ') {
if(preHasSpace) {
ans.push_back(' ');
preHasSpace = false;
}
ans.push_back(s[i]);
hasAl = true;
}
else {
if(hasAl) {
preHasSpace = true;
}
}
}
return ans;
}
};