151. 反转字符串中的单词 【中等】

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
 

提示:

1 <= s.length <= 104
s 包含英文大小写字母、数字和空格 ' '
s 中 至少存在一个 单词
 

进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。

方法一: 自己构造函数不要使用辅助空间,空间复杂度要求为O(1)

class Solution:
    def removeSpaces(self,s):
        left,right=0,len(s)-1
        #去除开头的空格
        while  left<right and s[left]==" ":
            left+=1
        #去除末尾的空格
        while left<right and s[right]==" ":
            right-=1
        #new_s存储去掉多余空格剩下的东西
        new_s=[]
        #去除单词间的多余空格,用Left
        while left<=right:
            if s[left]!=" ":
                new_s.append(s[left])

            elif s[left]==" "and new_s[-1]!=" ":
                new_s.append(s[left])
            #结束判断后指针右移
            left+=1
        return new_s
    #反转字符串
    def reverseString(self, s):
        # 初始化双指针
        left= 0
        right=len(s) - 1
        #当左指针小于右指针的时候
        while left<right:
            s[left],s[right]=s[right],s[left]
            left+=1
            right-=1
        return s
    #反转每个单词
    def reverseEachwords(self,s):
        #初始化指向每个单词前后的指针
        left,right=0,0
        n=len(s)

        while left<n:
            while right<n and s[right]!=' ':#当左边小于n并且循环里面右边小于n,右边递增
                right+=1
            #当不满足条件的时候,反转
            s[left:right]=self.reverseString(s[left:right])
            #反转完一个单词反转下一个
            left=right+1
            right+=1
        return s

    
    def reverseWords(self, s: str) -> str:
        #第一步:去除空格
        s=self.removeSpaces(s)
        #第二步:反转字符串
        s=self.reverseString(s)
        #第三步:反转每个单词
        s=self.reverseEachwords(s)
        #第四步:输出翻转后的字符串
        return "".join(s)

方法二:调用python函数

class Solution:
    def reverseWords(self, s: str) -> str:
        #方法一:调用api
        return " ".join(reversed(s.split()))

 方法三:python切片,也是o1

class Solution:
    def reverseWords(self,s:str)->str:
        #利用python的切片 以空格为分隔符
        s_list=[i for i in s.split(" ") if len(i)>0]
        #返回空格倒序的join
        return " ".join(s_list[::-1])
        #删除头尾空格的方法函数
        def trim_head_tail_space(ss:str):
            #删除首尾的空白符
            p=0#定义指针
            while p<len(ss) and ss[p]==" ":
                p+=1 #当p小于字符长度并且ssp是空格的时候后移,之后返回p之后的
            return ss[p:]
        #移除头尾的空格
        s=trim_head_tail_space(s)
        s=trim_head_tail_space(s[::-1])[::-1]
        #去除尾部的空格,然后倒序排列回来
        #翻转字符串 没有看太懂他这个写的过程
        pf,ps,s=0,0,s[::-1]
        while pf<len(s):
            if s[pf]==" ":#不会去除,因为我们清了头部的空格
                if s[pf]==s[pf+1]:
                    s=s[:pf]+s[pf+1:]
                    continue #此时s为pf前面的和pf+1后面的
                else:
                    s=s[:ps]+s[ps:pf][::-1]+s[pf:]
                    ps,pf=pf+1,pf+2  
            else:
                pf+=1
        return s[:ps]+s[ps:][::-1]        
# 解法二:
class Solution:
    def reverseWords(self, s: str) -> str:
        # method 1 - Rude but work & efficient method.
        s_list = [i for i in s.split(" ") if len(i) > 0]
        return " ".join(s_list[::-1])

        # method 2 - Carlo's idea
        def trim_head_tail_space(ss: str):
            p = 0
            while p < len(ss) and ss[p] == " ":
                p += 1
            return ss[p:]

        # Trim the head and tail space
        s = trim_head_tail_space(s)
        s = trim_head_tail_space(s[::-1])[::-1]

        pf, ps, s = 0, 0, s[::-1] # Reverse the string.
        while pf < len(s):
            if s[pf] == " ":
                # Will not excede. Because we have clean the tail space.
                if s[pf] == s[pf + 1]:
                    s = s[:pf] + s[pf + 1:]
                    continue
                else:
                    s = s[:ps] + s[ps: pf][::-1] + s[pf:]
                    ps, pf = pf + 1, pf + 2
            else:
                pf += 1
        return s[:ps] + s[ps:][::-1] # Must do the last step, because the last word is omit though the pointers are on the correct positions,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值