转载+修改:Day5 Q557反转字符串

python 反转字符串中单词思路详解

SwantsL3

发布于 2020-05-268.9k精选PythonPython3

解题思路

因为在 Python 中字符串是不可变,因此遍历字符串交换每个单词内字符位置的方法不太可行,但是利用 Python 切片的便利,可以写出更优雅的实现方式。

1、常规思路

将字符串分割成单词列表 然后把每个单词反转切片

代码

  • Python
class Solution(object):
    def reverseWords(self, s):
        return " ".join(word[::-1] for word in s.split(" "))

分析

  • 时间复杂度: O(n)O(n) 。其中 nn 是字符串的长度。
  • 空间复杂度: O(1)O(1) 。

2、利用两次切片,不需遍历

先反转单词列表 再反转字符串

以字符串 “I love drag queen” 为例:

s.split(" ") 将字符串分割成单词列表:

['I', 'love', 'drag', 'queen']

s.split(" ")[::-1] 将单词列表反转:

['queen', 'drag', 'love', 'I']

" ".join(s.split(" ")[::-1]) 将单词列表转换为字符串,以空格分隔:

"queen drag love I"

" ".join(s.split(" ")[::-1])[::-1] 将字符串反转:

”I evol gard neeuq“

代码

  • Python
class Solution(object):
    def reverseWords(self, s):
        return " ".join(s.split(" ")[::-1])[::-1]

分析

  • 时间复杂度: O(n)O(n) 。其中 nn 是字符串的长度。
  • 空间复杂度: O(1)O(1) 。

或者,

3、先反转字符串,再反转单词列表

s[::-1] 反转字符串:

“neeuq gard evol I”

s[::-1].split(" ") 将字符串分割成单词列表:

['neeuq', 'gard', 'evol', 'I']

s[::-1].split(" ")[::-1] 将单词列表反转:

['I', 'evol', 'gard', 'neeuq']

" ".join(s[::-1].split(" ")[::-1]) 将单词列表转换为字符串,以空格分隔:

“I evol gard neeuq”

代码

  • Python
class Solution(object):
    def reverseWords(self, s):
         return " ".join(s[::-1].split(" ")[::-1])

分析

  • 时间复杂度:O(n)O(n)。其中 nn 是字符串的长度。
  • 空间复杂度:O(1)O(1)。

 以上内容全部是转载,来自leetcode评论区最前面的python解法

上面的做法都非常简单,主要要学习其中利用python风格对于字符串的分割+切片反转之后指定字符拼接

另外对于list进行反转的操作也要学会鸭

接着干啥呢,鞭尸:记录我的垃圾解法:(后文都可以不看了)

比较Cpp风格的写法,巨复杂,虽然很锻炼debug能力。。

class Solution:
    def reverseWords(self, s: str) -> str:
        n = len(s)
        s2 = ''
        i = j = 0
        flag = 1 #1表示寻找空格模式
        while flag != -1: #-1表示退出
            if flag == 1:
                j +=1
                if i>=n:
                    flag = -1
                elif j==n or s[j] == ' ':  # 前后顺序不能变,先判断,免得超过边界
                    flag = 0 #0表示进入交换模式
                else:
                    pass
            elif flag == 0:
                for m in range(j-1,i-1,-1):
                    s2 += s[m]
                if j <n:  # 不是结尾的话
                    s2 += ' '
                i = j+1
                flag = 1
        return s2
# 这样速度反而更慢,92ms     
class Solution:
    def reverseWords(self, s: str) -> str:
        lister = s.split(' ')
        n = len(lister)
        str2 = ''
        i = 0
        for m in lister:
            m = list(m)
            m.reverse()
            for cha in m:
                str2 +=cha
            i +=1
            if i !=n:
                str2 +=' '
        return str2
# 执行用时:56 ms, 在所有 Python3 提交中击败了28.84%的用户
# 内存消耗:15.2 MB, 在所有 Python3 提交中击败了93.59%的用户

最后记录评论区的总结:

评论区:

字符串可变语言:

C/C++, Ruby, PHP, Swift

字符串不可变语言:

Java, Python, C#, Javascript, Go

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值