这是Hackerrank的问题解决部分中的实践问题之一。问题陈述说
Steve在ascii [‘a’。’z’]范围内有一串小写字符。他想通过执行一系列操作将字符串减小到最短长度。在每个操作中,他都会选择一对匹配的相邻小写字母,然后将其删除。
例如:'aaabbccc'->'ac','abba'->''
我尝试使用字符串切片解决此问题,但这给了我较大字符串超时运行时错误。还有什么要用的吗?
我的代码:
s = list(input())
i=1
while i<len(s):
if s[i]==s[i-1]:
s = s[:i-1]+s[i+1:]
i = i-2
i+=1
if len(s)==0:
print("Empty String")
else:
print(''.join(s))
这使我由于超时消息而被终止。
感谢您的时间:)
答案 0 :(得分:0)
嵌入每个新的不可变字符串可能会很昂贵,
因为它具有字符串长度的O(N)线性成本。
考虑处理"aa" * int(1e6)
。
您将按1e12
个字符的顺序写入内存
等你结束的时候。
花一点时间(好吧,花线性时间)
将每个字符复制到一个可变的list
元素中:
[c for c in giant_string]
然后,您可以通过编写tombstone来执行dup处理
""
中要删除的每个字符中的第一个,
仅使用恒定的时间。
最后,在线性时间内,您可以使用"".join( ... )
答案 1 :(得分:0)
另一种可能的解决方案是使用正则表达式。模式([a-z])\1
与重复的小写字母匹配。该实现将涉及以下内容:
import re
pattern = re.compile(r'([a-z])\1')
while pattern.search(s): # While match is found
s = pattern.sub('', s) # Remove all matches from "s"
我不是效率方面的专家,但这似乎比您的解决方案要少的字符串写入内存。对于"aa" * int(1e6)
到J_H mentioned的情况,由于pattern.sub
一次替换了所有出现,因此只会写入一个。