python 反转字符串中单词思路详解
发布于 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