# declare string s to test
s = 'ghaaawxyzijbbbklccc'
# s = 'edxeducation'
# declare 26 x 26 matrix m to hold letter counts
m = [[0 for j in range(0,26+1)] for i in range(0,26+1)]
# declare dictionary a2n to convert alphabet to number so a --> 1, b --> 2, etc.
a2n = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, \
'h':8, 'i':9, 'j':10, 'k':11, 'l':12, 'm':13, \
'n':14, 'o':15, 'p':16, 'q':17, 'r':18, 's':19, 't':20, \
'u':21, 'v':22, 'w':23, 'x':24, 'y':25, 'z':26}
# declare list n2a to convert number to alphabet
n2a = [0,'a','b','c','d','e','f','g','h','i','j','k','l','m'\
,'n','o','p','q','r','s','t','u','v','w','x','y','z']
# step functions takes the next letter and adds it to m
def step(a):
# look up number from letter
n = a2n[a]
# remember the position and count of the longest string so far
long_pos = 0
long_ct = 0
for i in range(1, n + 1):
if m[i][0] > long_ct:
long_pos = i
long_ct = m[i][0]
# if the longest is not the same as n
if n != long_pos:
# copy longest to n
for i in range(0,len(m[n])):
m[n][i] = m[long_pos][i]
# and add letter
m[n][0] += 1
m[n][n] += 1
# else just add letter
else:
m[n][0] += 1
m[n][n] += 1
# return the last string you modified
return m[n]
# longest function returns the longest string
def longest():
# remember position and count of the longest string
long_pos = 0
long_ct = 0
for i in range(1,len(m)):
if m[i][0] >= long_ct:
long_pos = i
long_ct = m[i][0]
# return longest string
out = ''
# iterate through letter counter for longest position
for i in range(1,len(m[long_pos])):
# and add letter that number of times
for j in range(0,m[long_pos][i]):
out += n2a[i]
return out
# iterate through string
for i in range(0,len(s)):
step(s[i])
# print longest string
print longest()
IyBkZWNsYXJlIHN0cmluZyBzIHRvIHRlc3QKcyA9ICdnaGFhYXd4eXppamJiYmtsY2NjJwojIHMgPSAnZWR4ZWR1Y2F0aW9uJwoKIyBkZWNsYXJlIDI2IHggMjYgbWF0cml4IG0gdG8gaG9sZCBsZXR0ZXIgY291bnRzCm0gPSBbWzAgZm9yIGogaW4gcmFuZ2UoMCwyNisxKV0gZm9yIGkgaW4gcmFuZ2UoMCwyNisxKV0KCiMgZGVjbGFyZSBkaWN0aW9uYXJ5IGEybiB0byBjb252ZXJ0IGFscGhhYmV0IHRvIG51bWJlciBzbyBhIC0tPiAxLCBiIC0tPiAyLCBldGMuCmEybiA9IHsnYSc6MSwgJ2InOjIsICdjJzozLCAnZCc6NCwgJ2UnOjUsICdmJzo2LCAnZyc6NywgXAogICAgJ2gnOjgsICdpJzo5LCAnaic6MTAsICdrJzoxMSwgJ2wnOjEyLCAnbSc6MTMsIFwKICAgICduJzoxNCwgJ28nOjE1LCAncCc6MTYsICdxJzoxNywgJ3InOjE4LCAncyc6MTksICd0JzoyMCwgXAogICAgJ3UnOjIxLCAndic6MjIsICd3JzoyMywgJ3gnOjI0LCAneSc6MjUsICd6JzoyNn0KCiMgZGVjbGFyZSBsaXN0IG4yYSB0byBjb252ZXJ0IG51bWJlciB0byBhbHBoYWJldApuMmEgPSBbMCwnYScsJ2InLCdjJywnZCcsJ2UnLCdmJywnZycsJ2gnLCdpJywnaicsJ2snLCdsJywnbSdcCiAgICAsJ24nLCdvJywncCcsJ3EnLCdyJywncycsJ3QnLCd1JywndicsJ3cnLCd4JywneScsJ3onXQoKIyBzdGVwIGZ1bmN0aW9ucyB0YWtlcyB0aGUgbmV4dCBsZXR0ZXIgYW5kIGFkZHMgaXQgdG8gbQpkZWYgc3RlcChhKToKICAgICMgbG9vayB1cCBudW1iZXIgZnJvbSBsZXR0ZXIKICAgIG4gPSBhMm5bYV0KICAgIAogICAgIyByZW1lbWJlciB0aGUgcG9zaXRpb24gYW5kIGNvdW50IG9mIHRoZSBsb25nZXN0IHN0cmluZyBzbyBmYXIKICAgIGxvbmdfcG9zID0gMAogICAgbG9uZ19jdCA9IDAKICAgIGZvciBpIGluIHJhbmdlKDEsIG4gKyAxKToKICAgICAgICBpZiBtW2ldWzBdID4gbG9uZ19jdDoKICAgICAgICAgICAgbG9uZ19wb3MgPSBpCiAgICAgICAgICAgIGxvbmdfY3QgPSBtW2ldWzBdCgogICAgIyBpZiB0aGUgbG9uZ2VzdCBpcyBub3QgdGhlIHNhbWUgYXMgbgogICAgaWYgbiAhPSBsb25nX3BvczoKICAgICAgICAjIGNvcHkgbG9uZ2VzdCB0byBuCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCxsZW4obVtuXSkpOgogICAgICAgICAgICBtW25dW2ldID0gbVtsb25nX3Bvc11baV0KCiAgICAgICAgIyBhbmQgYWRkIGxldHRlcgogICAgICAgIG1bbl1bMF0gKz0gMQogICAgICAgIG1bbl1bbl0gKz0gMQoKICAgICMgZWxzZSBqdXN0IGFkZCBsZXR0ZXIKICAgIGVsc2U6CiAgICAgICAgbVtuXVswXSArPSAxCiAgICAgICAgbVtuXVtuXSArPSAxCiAgICAgICAKICAgICMgcmV0dXJuIHRoZSBsYXN0IHN0cmluZyB5b3UgbW9kaWZpZWQKICAgIHJldHVybiBtW25dCgojIGxvbmdlc3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgbG9uZ2VzdCBzdHJpbmcKZGVmIGxvbmdlc3QoKToKICAgICMgcmVtZW1iZXIgcG9zaXRpb24gYW5kIGNvdW50IG9mIHRoZSBsb25nZXN0IHN0cmluZwogICAgbG9uZ19wb3MgPSAwCiAgICBsb25nX2N0ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSxsZW4obSkpOgogICAgICAgIGlmIG1baV1bMF0gPj0gbG9uZ19jdDoKICAgICAgICAgICAgbG9uZ19wb3MgPSBpCiAgICAgICAgICAgIGxvbmdfY3QgPSBtW2ldWzBdCgogICAgIyByZXR1cm4gbG9uZ2VzdCBzdHJpbmcKICAgIG91dCA9ICcnCiAgICAjIGl0ZXJhdGUgdGhyb3VnaCBsZXR0ZXIgY291bnRlciBmb3IgbG9uZ2VzdCBwb3NpdGlvbgogICAgZm9yIGkgaW4gcmFuZ2UoMSxsZW4obVtsb25nX3Bvc10pKToKICAgICAgICAjIGFuZCBhZGQgbGV0dGVyIHRoYXQgbnVtYmVyIG9mIHRpbWVzCiAgICAgICAgZm9yIGogaW4gcmFuZ2UoMCxtW2xvbmdfcG9zXVtpXSk6CiAgICAgICAgICAgIG91dCArPSBuMmFbaV0KICAgICAgICAgICAgCiAgICByZXR1cm4gb3V0CgojIGl0ZXJhdGUgdGhyb3VnaCBzdHJpbmcKZm9yIGkgaW4gcmFuZ2UoMCxsZW4ocykpOgogICAgc3RlcChzW2ldKQoKIyBwcmludCBsb25nZXN0IHN0cmluZwpwcmludCBsb25nZXN0KCkKCg==