Основная идея c, которую вы, похоже, хотите реализовать, заключается в следующем:
- начинайте с любого места в ожерелье, следите за тем, какой цвет вы начнете
- подсчет бусин до тех пор, пока цвет не изменится дважды
- учитывает только изменение как 'b' или 'r' как измененное, игнорируя 'w'
Однако ваше решение только начинается в начале ожерелья, а затем проходит через него один раз, никогда не возвращаясь туда, где он был ранее, чтобы проверить другие решения. Таким образом, он найдет решение, которое лучше, чем случайное, но он найдет лучшее, только если окажется, что он находится в хорошем положении в ожерелье.
Довольно наивная правильная реализация вашего подхода заключается в следующем. :
beads = "wwwbbrwrbrbrrbrbrwrwwrbwrwrrbwwwbbrwrbrbrrbrbrwrwwrbwrwrrb"
n = len(beads)
max_found = 0
for i in range(n):
changed = False
j = i
current = beads[j]
while True:
if beads[j] not in [current, 'w']:
if current != 'w':
if changed:
break
changed = True
current = beads[j]
j = (j + 1) % n
if j == i:
break
found = (j - i) % n if j != i else n
max_found = max(found, max_found)
# this just just here to show progress, not critical to the algorithm
if i < j:
print(beads[i:j], found)
else:
print(beads[i:]+beads[:j], found)
print('Solution:', max_found)
Конечно, это возвращается слишком жадно, проверяя каждый возможный разрез ожерелья, даже если он может запомнить длину самой последней последовательности максимальной длины.
One способ сделать это - запомнить последнюю позицию, где был замечен первый цвет предыдущей последовательности, и вернуться сразу после нее, вместо того, чтобы начинать с каждой отдельной позиции, как указано выше. Вот это немного более сложное решение:
beads = "wwwbbrwrbrbrrbrbrwrwwrbwrwrrbwwwbbrwrbrbrrbrbrwrwwrbwrwrrb"
n = len(beads)
max_found = 0
c = 0
i = 0
while i < n:
changed = False
j = i
current = beads[j]
while True:
if beads[j] not in [current, 'w']:
if current != 'w':
if changed:
break
changed = True
current = beads[j]
if beads[j] == current and not changed:
c = j + 1 if j >= c else n
j = (j + 1) % n
if j == i:
break
found = (j - i) % n if j != i else n
max_found = max(found, max_found)
# this just just here to show progress, not critical to the algorithm
if i < j:
print(beads[i:j], found)
else:
print(beads[i:]+beads[:j], found)
# this line *is* part of the solution, but needs to happen after the prints
i = c
print('Solution:', max_found)
Edit: @ Kri sh указал, что решение пропустило краевой случай, приведенный выше код был исправлен, поэтому алгоритм теперь также корректно обрабатывает beads = "rrr"
.