一、字符串按照单词顺序翻转 LeetCode - 151. Reverse Words in a String
Given an input string, reverse the string word by word.
Input: “the sky is blue”
Output: “blue is sky the” Example 2:
Input: " hello world! "
Output: “world! hello”
Input: “a good example”
Output: “example good a”
也就是说,把字符串按照单词顺序翻转,且扔掉前导零和后缀零,且每个单词中间一个空格。
string reverseWords(string s) {
string res;
auto i = s.length() - 1;
while(i >= 0) {
int r = i;
while (r >= 0 && s[r] == ' ')
--r;
if(r <= -1) return res.substr(0, res.length() - 1);
int l = r;
while (l >= 0 && s[l] != ' ') --l;
res += s.substr(l + 1, r - l) + " ";
i = l;
}
return res.substr(0, res.length() - 1);
}
二、字符串中每个单词翻转
有的题目是让字符串中每个单词翻转,单词的定义就是26个大小写英文字母,即空格和符号都不算单词,如下例:
Input: “Hello World! abc def *”
Output: “olleH dlroW! cba fed *”
即单词间空格数不变,且符号不算为单词。就是一个一个遍历,每个单词翻转,然后空格和符号不变即可。
string reverseStr(string s) {
string res;
for (int i = 0; i < s.length(); ++i) {
if (!((s[i] >= 'a' && s[i] <= 'z') ||
(s[i] >= 'A' && s[i] <= 'Z'))) {
res.push_back(s[i]);
continue;
}
string tmp;
while (i < s.length() &&
((s[i] >= 'a' && s[i] <= 'z') ||
(s[i] >= 'A' && s[i] <= 'Z'))) {
tmp.push_back(s[i]);
++i;
}
reverse(tmp.begin(), tmp.end());
res += tmp;
if (i < s.length() - 1) --i;
}
return res;
}