刷题网站:Leetcode
难度: 简单
语言: Python
计划:从简单——>到中等——>再到难。
一、557反转字符串III
1.1 题目:
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
- 示例
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
1.2 思考分析:
此题是输入一个字符串,然后输出字符串中每个单词的反转。看似简单,其实还是稍微要动一下脑筋思考。最初,我是想将字符串以单词为单位分成若干个子字符串,然后利用双指针方法将它们左右逐个交换,最后再重新组合,但是发现太麻烦了,且中间存在的一些变量变换很繁琐,搞了好久就达不到理想的结果。(可是做完后发现,我这个想法和官方解法有点类似,我为什么没写出代码呢!!!)
然后,想到了python中的切片可以将字符串反转,在此之前我需要理解什么叫切片?以下是我整理的一些资料:
- 1)在python中,切片通俗来说就是将一个字符串“切”成若干份,通常用
:
符号来执行切片操作,这个:
用来定义分片和步长。 - 2)一个完整的切片表达式有两个
:
构成,用于分割三个参数(start_idex : end_index : step)
。 - 3)切片分类:从左到右的正向切(即
step=1
)、从右到左的反向切(即step=-1
)。 - 4)当只有一个
:
时,默认step=1
。例如,s[:i]
表示从第0个元素到第i-1个元素,且不包括第i个。s[2:10:2]
表示输出从第2个到第9个,步长为2的所有元素 - 5)例子
- 输入字符串
s="hello world!"
和print(s[::-1])
,输出!dlrow olleh
。 - 输入字符串
s="hello world!"
和print(s[2:10:2])
,输出lowr
。 - 输入字符串
s="hello world!"
和print(s[:5:-1])
,输出!dlrow
。
- 输入字符串
然后是对切片后的字符进行分割,用split()
函数,默认以空格来进行划分。
- 例子
a = "hello world!"
print(a.split())
输出
['hello','world!']
因此,这题的完整代码如下
class Solution:
def reverseWords(self, s: str) -> str:
s = s[::-1]
s_list = s.split()
ss = str()
for i in range (1, len(s_list)+1):
if ss:
ss +=" "+s_list[-i]
else:
ss = s_list[-i]
return ss
这个算法的思想是,先对原字符串整个进行翻转,然后将其结果进行分割(以空格为区分),其次再以此从右到左进行重新组合成新的字符串输出。故执行结果如下。
1.3 总结
此题重点理解字符串和数组的区别,不能用简单的双指针来解决,而是对每个单词进行了翻转。