函数删除超过 2 个连续重复的字符串不起作用
Function to remove more than 2 consecutive repetitions of a string not working
这是我的函数:
def remove_more_than_two_reps(text):
result = list(text)
for idx,char in enumerate(text):
if(result[:idx].count(char) > 2):
result.remove(char)
return ''.join(result)
预期结果:
text = 'teeeexxxxt'
result = remove_more_than_two_reps(text)
>'teexxt'
我的函数只是returns原来的字符串,有什么问题吗?
尝试使用 append
即 O(1)
而不是 remove
即 O(n)
:
def remove_more_than_two_reps(text: str) -> str:
result = []
for ch in text:
if len(result) < 2 or result[-1] != ch or result[-2] != ch:
result.append(ch)
return ''.join(result)
text = 'teeeexxxxt'
result = remove_more_than_two_reps(text)
print(result)
输出:
teexxt
想分享一个 itertools
解决方案,当你有特别大的字符串时很有用(因为它避免分配一个巨大的列表):
import itertools as it
def remove_more_than_two_reps(text: str) -> str:
reps_of_at_most_two = (it.islice(reps, 2) for _, reps in it.groupby(text))
return ''.join(it.chain.from_iterable(reps_of_at_most_two))
请注意,此解决方案只遍历字符串中的每个字符,因此它也具有最佳复杂度!
另一个选项可能是使用模式,匹配相同字符 3 次或更多次 (.){2,}
并在替换中使用捕获组值的 2 倍:
import re
def remove_more_than_two_reps(text):
return re.sub(r'(.){2,}', r'', text)
text = 'teeeexxxxt'
print(remove_more_than_two_reps(text))
输出
teexxt
看到一个regex demo and a Python demo。
这是我的函数:
def remove_more_than_two_reps(text):
result = list(text)
for idx,char in enumerate(text):
if(result[:idx].count(char) > 2):
result.remove(char)
return ''.join(result)
预期结果:
text = 'teeeexxxxt'
result = remove_more_than_two_reps(text)
>'teexxt'
我的函数只是returns原来的字符串,有什么问题吗?
尝试使用 append
即 O(1)
而不是 remove
即 O(n)
:
def remove_more_than_two_reps(text: str) -> str:
result = []
for ch in text:
if len(result) < 2 or result[-1] != ch or result[-2] != ch:
result.append(ch)
return ''.join(result)
text = 'teeeexxxxt'
result = remove_more_than_two_reps(text)
print(result)
输出:
teexxt
想分享一个 itertools
解决方案,当你有特别大的字符串时很有用(因为它避免分配一个巨大的列表):
import itertools as it
def remove_more_than_two_reps(text: str) -> str:
reps_of_at_most_two = (it.islice(reps, 2) for _, reps in it.groupby(text))
return ''.join(it.chain.from_iterable(reps_of_at_most_two))
请注意,此解决方案只遍历字符串中的每个字符,因此它也具有最佳复杂度!
另一个选项可能是使用模式,匹配相同字符 3 次或更多次 (.){2,}
并在替换中使用捕获组值的 2 倍:
import re
def remove_more_than_two_reps(text):
return re.sub(r'(.){2,}', r'', text)
text = 'teeeexxxxt'
print(remove_more_than_two_reps(text))
输出
teexxt
看到一个regex demo and a Python demo。