Вот интересное решение, которое чрезвычайно эффективно.Он рассматривает проблему с совершенно другой точки зрения.
q=int(input())
x=input()
y = x[0: q]
alphabet = {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0,
'k': 0, 'l': 0, 'm': 0, 'n': 0, 'o': 0, 'p': 0, 'q': 0, 'r': 0, 's': 0, 't': 0,
'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0, ' ': 0}
letters = set(list(y))
for letter in letters:
alphabet[letter] += y.count(letter)
repeats = [i for i in list(alphabet.values()) if i > 1]
singles = len(y)
count = singles
for repeat in repeats:
count += ((repeat*(repeat - 1))/2)
Что здесь происходит? Посмотрите на искусственный пример, где y = 'abbda efba hia jkla mbnop' и рассмотрим символ 'a'. Как это подсчитывается?
1) Он подсчитывается каждый раз, когда он появляется в строке. Это 5 раз, и это фиксируется в словаре «алфавит». Существует один проход через уникальные символы в строке, чтобы получить счет. Это меньше или равно 27 символам. Я включил пробел. Это тоже нужно учитывать!
2) Символ 'a' также считается другим способом по оригинальному алгоритму. Он подсчитывается, когда он появляется на обоих концах подстроки. В этом случае для первого «а», который появляется, мы получаем вложенные строки:
abba
abba efba
abba efba hia
abba efba hia jkla
для второго «а», который появляется там еще три таких суб строки:
a efba
a efba hia
a efba hia jkla
И так вниз по линии. Поэтому мы подсчитываем «а» 5 раз за каждый раз, когда он появляется в строке, но также подсчитываем 4 + 3 + 2 + 1 подстроки, где они находятся на концах. Это просто r (r-1)/еще 2 числа для буквы «a». Нет необходимости в цикле, когда есть аналитическое выражение для результата. Это является основой эффективности алгоритма.
Не могли бы вы рассказать нам, что он пытается достичь? – moreON
Можно описать, что делает ваш алгоритм? –
в данной строке вы должны проверить, имеют ли подстроку одни и те же первые и последние буквы. Если вы считаете это – zeref