Это можно сделать с помощью регулярных выражений:
import re
def noDoubles(string):
subChars = set("wxyz")
result = list(string)
for match in re.finditer(r"(.)(\1+)",string):
usedChars = set(string[match.start():match.end()+1])
altChars = list(subChars - usedChars)
size = match.end(2) - match.start(2)
size = size - (size>1)
result[match.start(2):match.start(2)+size] = (altChars[:2]*size)[:size]
return "".join(result)
print(noDoubles("xyxxxyaaabbyyaaaaa")) # "xyxzxyazabzyzazwza"
Выражение (.) (\ 1+) находит первый символ и последующие повторения строки повторяющихся символов.Зацикливание совпадений позволит вам заменить эту последующую часть чередующимся набором символов, которые не повторяются и не следуют за ним.Вам нужно использовать чередующийся шаблон для замены, чтобы не создавать новые повторения.
Обратите внимание, что нам нужно работать только с 4 символами замещения, потому что повторяющийся символ и следующий символ будут либо одним, либодва из 4 (оставляя два для альтернанса) или ни одного из них (что позволяет нам использовать любые два из 4).