leetcode-151-Reverse-Words-in-a-String

描述


Given an input string s, reverse the order of the words.

A word is defined as a sequence of non-space characters. The words in s will be separated by at least one space.

Return a string of the words in reverse order concatenated by a single space.

Note that s may contain leading or trailing spaces or multiple spaces between two words. The returned string should only have a single space separating the words. Do not include any extra spaces.

Example 1:

1
2
Input: s = "the sky is blue"
Output: "blue is sky the"

Example 2:

1
2
3
Input: s = "  hello world  "
Output: "world hello"
Explanation: Your reversed string should not contain leading or trailing spaces.

Example 3:

1
2
3
Input: s = "a good   example"
Output: "example good a"
Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string.

Example 4:

1
2
Input: s = "  Bob    Loves  Alice   "
Output: "Alice Loves Bob"

Example 5:

1
2
Input: s = "Alice does not even like bob"
Output: "bob like even not does Alice"

Constraints:

  • 1 <= s.length <= 104
  • s contains English letters (upper-case and lower-case), digits, and spaces ' '.
  • There is at least one word in s.

Follow-up: If the string data type is mutable in your language, can you solve it in-place with O(1) extra space?

分析


翻转字符串里的单词。

解决方案1(Python)


调用标准库实现。

1
2
3
class Solution:
def reverseWords(self, s: str) -> str:
return " ".join(reversed(s.split()))

解决方案2(Python)


自己实现去除空格,反转字符串,反转字符串列表。

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
32
33
34
35
36
37
class Solution:

def trim_spaces(self, s):
left, right = 0, len(s) - 1
while left <= right and s[left] == ' ':
left += 1
while left <= right and s[right] == ' ':
right -= 1
result = []
while left <= right:
if s[left] != ' ':
result.append(s[left])
elif result[-1] != ' ':
result.append(s[left])
left += 1
return result

def reverseStrList(self, myList, left, right):
while left < right:
myList[left], myList[right] = myList[right], myList[left]
left, right = left + 1, right-1

def reverseAllWord(self, myList):
myListLen = len(myList)
start = end = 0
while start < myListLen:
while end < myListLen and myList[end] != ' ':
end += 1
self.reverseStrList(myList, start, end-1)
start = end + 1
end += 1

def reverseWords(self, s: str) -> str:
noSpacesList = self.trim_spaces(s)
self.reverseStrList(noSpacesList, 0, len(noSpacesList)-1)
self.reverseAllWord(noSpacesList)
return ''.join(noSpacesList)

解决方案2 (Golang)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import "strings"

func reverseWords(s string) string {
stringList := strings.Fields(s)
reverseStringList(&stringList, 0, len(stringList)-1)
return strings.Join(stringList, " ")
}

func reverseStringList(strList *[]string, i int, j int) {
for i <= j {
(*strList)[i], (*strList)[j] = (*strList)[j], (*strList)[i]
i++
j--
}
}

相关问题


题目来源