题目要点:
1:字符串首尾都有可能存在多余的空格
2:字符串中间单词之间又可能存在连续多个空格
解法1:从字符串手择单词,放到一个缓存数组里
class Solution {
private:
//传入字符串的左下标,确定单词的有效左右下标,右下标指向单词的下一位
bool getWord(const string& s, int len, int& left, int& right) {
while (left < len && s[left] == ' ')
left++;
if (left >= len)
return false;
right = left + 1;
while (right < len && s[right] != ' ')
right++;
return true;
}
public:
string reverseWords(string s) {
int len = s.length();
int left = 0, right;
vector<string> str;
string res = "";
bool flag = getWord(s, len, left, right); //择出来所有单词
while (flag) {
str.push_back(s.substr(left, right - left));
left = right + 1;
flag = getWord(s, len, left, right);
}
int strLen = str.size(); //连接所有单词
if (strLen == 0)
return res;
res = str[0];
for (int i = 1; i < strLen; i++)
res = str[i] + ' ' + res;
return res;
}
};
解法2:在解法1基础上,直接连接单词,不用缓存数组
class Solution {
private:
bool getWord(const string& s, int len, int& left, int& right) {
while (left < len && s[left] == ' ')
left++;
if (left >= len)
return false;
right = left + 1;
while (right < len && s[right] != ' ')
right++;
return true;
}
public:
string reverseWords(string s) {
int len = s.length();
int left = 0, right;
string res = "";
bool flag = getWord(s, len, left, right);
while (flag) {
if (res != "")
res = s.substr(left, right - left) + ' ' + res;
else
res = s.substr(left, right - left);
left = right + 1;
flag = getWord(s, len, left, right);
}
return res;
}
};
解法3:利用stringstream,需要额外处理单词后面多余空格
class Solution {
public:
string reverseWords(string s) {
string tmp, res = "";
stringstream ss(s);
int right;
while (getline(ss, tmp, ' ')) { //以一个空格符分割,每个单词可能还有多余的空格
if (tmp == "") //多个连续空格情况
continue;
right = tmp.length() - 1; //处理单词后面额外空格
while (right > 0 && tmp[right] == ' ')
right--;
tmp = tmp.substr(0, right + 1);
//printf("tmp = %s\n", tmp.c_str());
if (res != "") //连接单词
res = tmp + ' ' + res;
else
res = tmp;
}
return res;
}
};