Пусть вам нужно найти подстроки с символом X.
Сканирование строки слева направо, сохраняя позицию последнего X: lastX
с начальным значением -1
Когда вы встретите X в позиции i, добавьте i+1
к результату и обновите lastX
(это количество подстрок, оканчивающихся на текущую позицию, и все они содержат X)
Когда вы встречаете другого персонажа, добавьте lastX + 1
к результату
(это опять число подстрок, оканчивающихся на текущую позицию и содержащих X),
потому что самый правый возможный старт подстроки - это позиция последнего X
Алгоритм является линейным.
Пример:
a X a a X a
good substrings overall
idx char ending at idx lastX count count
0 a - -1 0 0
1 X aX X 1 2 2
2 a aXa Xa 1 2 4
3 a aXaa Xaa 1 2 6
4 X aXaaX XaaX aaX aX X 4 5 11
5 a aXaaXa XaaXa aaXa aXa Xa 4 5 16
Код Python:
def subcnt(s, c):
last = -1
cnt = 0
for i in range(len(s)):
if s[i] == c:
last = i
cnt += last + 1
return cnt
print(subcnt('abcdba', 'b'))