0%

reverse-words-in-a-string

题目描述

给定一个字符串,逐个翻转字符串中的每个单词。

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

题解

先放一个空间复杂度为O(n)的:

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
29
30
31
string reverseWords(string s) {
string word = "";
int i = 0, j = 0;
stack<string> stk;
while (s[i] == ' ')
i++;
j = i;
while (i < s.length())
{
while (j<s.length()&&s[j] != ' ')j++;
if (j == s.length())
{
if(j>i)
stk.push(s.substr(i, j - i));
break;
}
stk.push(s.substr(i, j - i));
while (s[j] == ' ')
j++;
i = j;
}
string res = " ";
while (!stk.empty())
{
word = stk.top();
stk.pop();
res =res+ word+" ";
}
if (res.length() == 1)return "";
return res.substr(1, res.length() - 2);
}

不过效率太低了。睡一觉再改吧。

先将字符串整个反转一下,然后再反转单个单词就行了。这其中可以去掉空格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
string reverseWords(string s)
{
reverse(s.begin(), s.end());
int n = s.size();
int idx = 0;
for (int i = 0; i < n; i++)
{
if (s[i] != ' ')
{
if (idx != 0)
s[idx++] = ' ';
int j = i;
while (j < n&&s[j] != ' ')
{
s[idx++] = s[j++];
}
reverse(s.begin() + idx - (j - i), s.begin() + idx);
i = j;
}
}
s.erase(s.begin() + idx, s.end());
return s;
}