avatar

LeetCode-151 翻转字符串里的单词

📝题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
给定一个字符串,逐个翻转字符串中的每个单词。 

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"

示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。


📝思路

毫不费力的思路:分割出单词->反向拼接
可以用很多方式完成。Java支持库函数split()可以直接以空格为分隔符拆解,trim()筛掉前后空格,几行代码搞定;C++选手可以用stringstream或者手动实现分割拼接,据说此题的出题目的是考察双指针操作字符数组…
我用的正则表达式辅助实现分割,vector容器实现反向拼接…总之题目不是很难,但是手动实现时难免踩到很多坑🤦‍♀️
官方思路和题解请戳此😃

📝题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
string reverseWords(string s) {
vector<string> words;
int len = s.size();
string tmp = "";
regex reg("[ ]*");//空或纯空格时为真
for (int i = 0; i < len; ++i){
if (regex_match(tmp, reg)) tmp = "";
if (s[i] == ' ' && !regex_match(tmp, reg)){
words.push_back(tmp);
tmp = "";
}
else {
tmp += s[i];
}
}
if (!regex_match(tmp, reg)) words.push_back(tmp);

int len2 = words.size();
if (len2 == 0) return "";//题目没有讲但是输入为全空格时输出为空,这里容易被坑
string temp = "";
for (int i = 0; i < len2-1; ++i){
temp += words.back();
temp += " ";
words.pop_back();
}
temp += words.back();
return temp;
}
Author:WhiteBeerHouse
Link:https://github.com/WhiteBeerHouse/WhiteBeerHouse.github.io/tree/master/2020/04/10/LeetCode-151-%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D/
Copyright Notice:All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.