Вы можете использовать стек для достижения O (n) временная сложность. Итерации над символами в строке и для каждого символа проверяют, содержит ли верхняя часть стека один и тот же символ. В случае, если он выдает символ из стека и переходит к следующему элементу. В противном случае нажмите символ в стек. Все, что остается в стеке результат:
s = 'aaabccddd'
stack = []
for c in s:
if stack and stack[-1] == c:
stack.pop()
else:
stack.append(c)
print ''.join(stack) if stack else 'Empty String' # abd
Update На основе обсуждения я побежал пару тестов, чтобы измерить скорость регулярных выражений и стека решений, основанных с входной длиной 100
. Тесты проводились на Python 2.7 на Windows 8:
All same
Regex: 0.0563033799756
Stack: 0.267807865445
Nothing to remove
Regex: 0.075074750044
Stack: 0.183467329017
Worst case
Regex: 1.9983200193
Stack: 0.196362265609
Alphabet
Regex: 0.0759905517997
Stack: 0.182778728207
код, используемый для сравнительного анализа:
import re
import timeit
def reduce_regexp(text):
even = re.compile(r'(?:([a-z])\1)+')
prev = len(text) + 1
while len(text) < prev:
prev = len(text)
text = even.sub(r'', text)
return text
def reduce_stack(s):
stack = []
for c in s:
if stack and stack[-1] == c:
stack.pop()
else:
stack.append(c)
return ''.join(stack)
CASES = [
['All same', 'a' * 100],
['Nothing to remove', 'ab' * 50],
['Worst case', 'ab' * 25 + 'ba' * 25],
['Alphabet', ''.join([chr(ord('a') + i) for i in range(25)] * 4)]
]
for name, case in CASES:
print(name)
res = timeit.timeit('reduce_regexp(case)',
setup='from __main__ import reduce_regexp, case; import re',
number=10000)
print('Regex: {}'.format(res))
res = timeit.timeit('reduce_stack(case)',
setup='from __main__ import reduce_stack, case',
number=10000)
print('Stack: {}'.format(res))
Почему 'aab'? Это 'aa' - смежная пара в вашем примере ввода. –
Вы не очень хорошо объясняете проблему Hackerrank. Там образец «aabcc» (2 раза 'c', а не 3), и они говорят о ** одной операции ** в серии. –
aab, поскольку он удаляет cc, который является одной операцией, а в другой операции он удаляет aa и формы b. Также исправлено это, ссылка предоставляется только потому, что я не мог правильно объяснить проблему. –