剑指 Offer 58 - I. 翻转单词顺序
题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
示例1:
输入: "the sky is blue"
输出: "blue is sky the"
示例2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof
思路解析
- 去掉字符串首位空格(这里需要考虑的特殊情况:全是空格的情况)
- 使用双指针
i
和j
,i
和j
均初始化至字符串末尾 i
向前移动,直至找到第一个为空格的字符,此时字符串s
的在i
和j
之间的子字符串即为最后一个单词i
继续向前移动,直至找到下一个不为空格的字符,令i
和j
均指向此处,重复步骤3,得到倒数第二个、第三个...、第n个单词- 为了方便处理边界条件,即
i == 0
的情况,在第3步之前,对输入的字符串去掉首位空格后,在此字符串首插入一个空格。
代码实现
class Solution {
public:
string reverseWords(string s) {
// Exception
if(s == "") return s;
// Init
string result;
int i, j;
i = 0; j = s.length() - 1;
// Erase start and end space
while(i < s.length() && s[i] == ' ') i++;
while(j >= 0 && s[j] == ' ') j--;
s.erase(j + 1, s.length() - j);
if(j > i) s.erase(0, i);
if(s.length() == 0) return s;
// Work
s = ' ' + s;
i = s.length() - 1;
j = s.length() - 1;
while(i > 0) {
while(s[i] != ' ') i--;
result += s.substr(i + 1, j - i);
result += ' ';
while((i > 0) && (s[i] == ' ')) i--;
j = i;
}
result.erase(result.length() - 1, 1);
return result;
}
};