4/05/2014

Leetcode -- Reverse Words in a String

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: