class Solution {
public:
void reverseWords(string &s) {
if(s == "") {
return;
}
vector<string> container;
removeLeadingBlanks(s);
size_t tok = s.find_first_of(' ');
while(tok != string::npos) {
string part(s.substr(0, tok));
container.emplace_back(part);
s = s.substr(tok);
removeLeadingBlanks(s);
tok = s.find_first_of(' ');
}
removeTrailingBlanks(s);
if(s != "") {
container.emplace_back(s);
}
string result;
for(int i = container.size() - 1; i >= 0; --i) {
result += container[i] + " ";
}
if(result.length() != 0) {
s = result.substr(0, result.length() - 1);
}
}
void removeLeadingBlanks(string& s) {
size_t start = s.find_first_not_of(' ');
if(start == string::npos) {
s = "";
} else {
s = s.substr(start);
}
}
void removeTrailingBlanks(string& s) {
size_t end = s.find_first_of(' ');
if(end != string::npos) {
s = s.substr(0, s.length() - end);
}
}
};
Even better
class Solution {
public:
void reverseWords(string &s) {
trimLeft(s);
trimRight(s);
reverse(s);
int start = 0;
while(start < s.size()) {
while(start < s.size() && s[start] == ' ') {
s.erase(s.begin() + start);
}
int end = start;
while(end < s.size() && s[end]!=' ') {
end++;
}
end--;
reverseSingleWord(s, start, end);
start = end + 2;
}
}
void reverse(string& s) {
int start = 0;
int end = s.size() - 1;
while(start < end) {
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
void trimLeft(string& s) {
while(!s.empty()&& s[0] == ' ') {
s.erase(s.begin());
}
}
void trimRight(string& s) {
while(!s.empty()&& s[s.size() - 1] == ' ') {
s.erase(s.end() - 1);
}
}
void reverseSingleWord(string & s, int start, int end) {
while(start < end) {
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
};
No comments:
Post a Comment