剑指 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]
原文地址:https://www.cnblogs.com/yeshengCqupt/p/13474120.html