剑指 Offer 58
- 题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
- 解法一:双指针
初始res为一个空list,用两个指针i,j分别记录一个单词的左右边界,为了满足倒序,i和j从后往前遍历,首先需要将字符串s去除首端和尾端的空格,然后再用双指针从后往前遍历s,i是字符串的左边界,j是字符串有边界,当i遇到空格时,s[i+1:j+1],则为其中一个子字符,存入res中。接着继续往前挪动,直到不为空格,此时将j也指向i。
时间复杂度O(N),空间复杂度O(N)
class Solution: def reverseWords(self, s: str) -> str: s = s.strip() i = j = len(s) - 1 res = [] while i >= 0: while i >= 0 and s[i] != ' ': i -= 1 res.append(s[i+1:j+1]) while s[i] == ' ': i -= 1 j = i return ' '.join(res)
- 解法二:python库函数
1.删除首尾空格
2.分割字符串
3.反转
时间复杂度O(N),空间复杂度O(N)
class Solution: ''' python 库函数法 ''' def reverseWords(self, s: str) -> str: s = s.strip() #删除首位空格 s = s.split() #分割字符串,split(' ')不会将多余空格看成一个空格,而split()会将多个空格看成一个空格 s.reverse() #反转 return ' '.join(s)
- 解法三:栈的思想pop
时间复杂度O(N),空间复杂度O(N)
class Solution: def reverseWords(self, s: str) -> str: slist = s.split(' ') res_string = '' while slist: astring = slist.pop() if astring != '': res_string += astring + ' ' return res_string[:-1]