还有什么其他方法可以用来分割字符串吗?

时间:2019-07-07 17:35:18

标签: python-3.x

这是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))

这使我由于超时消息而被终止。

感谢您的时间:)

2 个答案:

答案 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一次替换了所有出现,因此只会写入一个。