leetcode 1957 删除字符使字符串变好
- 正文
- 题目说明
- Python 常用技巧
- 解题思路
- 方法1
- 方法2
- 方法3
正文
题目说明
Python 常用技巧
Python
中在字符串中做删除元素的操作是很困难的,通常我们都会创建一个新的字符串或者列表,然后进行循环,将不需要被删除的字符添加进新的字符串或者列表中,最后获取结果。
解题思路
从题目可知,连续三个相同字符出现时,删除第三个字符,那么我们需要分情况,当给定字符串的长度小于 3
时,直接输出原始字符串即可,而当原始字符串的长度大于 3
时我们需要判断是否存在连续三个相同的字符,即 s[i] == s[i-1] == s[i-2],在理解了这一层后我们即可写出如下代码。
方法1
class Solution:
def makeFancyString(self, s: str) -> str:
if len(s) < 2:
return s
else:
lst = [s[0], s[1]]
for i in range(2, len(s)):
if s[i] == s[i - 1] == s[i - 2]:
continue
else:
lst.append(s[i])
return ''.join(lst)
方法2
方法 1
中给出的代码解决了问题,但是这个分情况讨论的 if else
显得有些冗杂,我们可不可以去掉这个判断呢?我们可以将 if
判断放在 for
循环下的 if
中也可以实现相同的结果。
class Solution:
def makeFancyString(self, s: str) -> str:
lst = []
for i in range(len(s)):
if len(lst) >=2 and s[i] == s[i - 1] == s[i - 2]:
continue
lst.append(s[i])
return ''.join(lst)
上述写法代码非常简单,但是逻辑关系并不通俗易懂,且因为我们将 len(lst)
长度判断放置在了 for
循环下,每一次 for
循环都要额外做一次长度判断,显然会增加代码处理的时间。个人倾向于使用方法 1
完成对应的操作。
方法3
class Solution:
def makeFancyString(self, s: str) -> str:
s1 = ''
for i in range(len(s)):
if len(s1) >=2 and s[i] == s[i - 1] == s[i - 2]:
continue
s1 += s[i]
return s1
我们在之前 Python
的常用技巧中提及了可以生成一个空的字符串来完成这一操作,但是这种方式的用时比使用列表更长。因此,以后的字符串操作,我们都尽量使用列表来完成。
如果大家觉得有用,就请点个赞吧~