7. Reverse Words in a String

时间:2021-09-23 15:47:46
题目:

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

click to show clarification.

Clarification:

  • What constitutes a word?
    A sequence of non-space characters constitutes a word.
  • Could the input string contain leading or trailing spaces?
    Yes. However, your reversed string should not contain leading or trailing spaces.
  • How about multiple spaces between two words?
    Reduce them to a single space in the reversed string.

解题思路: 先整体翻转,在把单词一个个翻转。(或反过来也行)

代码也许还能优化:

class Solution {
public:
	void reverseWords(string &s) {
		if(s == "") return;
		if(s.length() == popBlankLead(s)) return;
		else if(popBlankTrail(s) < 0) return;
		int judge = 0;
		while(judge < s.length() && s[judge] != ' ') ++judge;
		if(judge == s.length()) return;

		reverseAlpha(s, 0, s.length() - 1);
		int start = 0;
		for(int end = 0; end < s.length(); ++end){
			if(s[end] == ' '){
				while(s[end + 1] == ' '){
					s.erase(end, 1);
				}
				reverseAlpha(s, start, end - 1);
				start = end + 1;
			}
		}
		reverseAlpha(s, start, s.length() - 1);
	}
	void reverseAlpha(string &s, int begin, int end){
		if(s == "" || begin >= end) return;
		int mid = (end + begin +1) >> 1;
		for(int i = begin; i < mid; ++i){
			char c = s[i];
			s[i] = s[end];
			s[end--] = c;
		}
	}
	int popBlankLead(string &s){
		int first = 0;
		while(s[first] == ' ' && first < s.length()) ++first;
		s.erase(0, first);
		return first;
	}
	int popBlankTrail(string &s){
		int end = s.length() - 1;
		while(s[end] == ' ' && end >= 0) --end;
		s.erase(end + 1,s.length() - end - 1);
		return end;
	}
};

 精简版代码:

class Solution {
public:
	void reverseWords(string &s) {
		string buf;
        stringstream ss(s);
        vector<string> tokens;
        while (ss >> buf) tokens.push_back(buf);
        if (tokens.size() == 0)  s="";
        else{
            int n = tokens.size()-1;
            s = tokens[n];
            for (int i = n-1; i >=0; -- i) s+=" "+tokens[i];
            }
	    }
};