Краткий ответ: ищем несовпадающие симметричные пары s[i] и s[n-1-i]. Один обмен может затронуть не более двух таких пар. Поэтому достаточно проверить несколько кандидатов.
Ключевая идея
- Несовпадений нет — строка уже палиндром. Можно поменять первый и последний символы: в палиндроме они равны, строка не изменится.
- Одна несовпадающая пара
(i, j)— при нечётной длине пробуем поменятьiс центральным символом иjс центральным. - Две несовпадающие пары
(i1, j1)и(i2, j2)— проверяем 4 варианта:i1↔i2i1↔j2j1↔i2j1↔j2
Первый обмен, после которого получается палиндром, выводим. Нумерация в ответе — с 1.
import sys
def solve():
s = sys.stdin.readline().strip()
n = len(s)
bad = []
for i in range(n // 2):
j = n - 1 - i
if s[i] != s[j]:
bad.append((i, j))
def good(a, b):
if a == b:
return False
t = list(s)
t[a], t[b] = t[b], t[a]
for i in range(n // 2):
if t[i] != t[n - 1 - i]:
return False
return True
if not bad:
print(1, n)
return
candidates = []
if len(bad) == 1:
i, j = bad[0]
mid = n // 2
candidates = [(i, mid), (j, mid)]
else:
i1, j1 = bad[0]
i2, j2 = bad[1]
candidates = [
(i1, i2),
(i1, j2),
(j1, i2),
(j1, j2),
]
for a, b in candidates:
if good(a, b):
if a > b:
a, b = b, a
print(a + 1, b + 1)
return
if __name__ == "__main__":
solve()
Проверка на примере: cbcaba
Несовпадают пары (1, 6) и (3, 4). Обмен позиций 1 и 4 даёт abccba — палиндром.
Сложность: O(n) по времени, O(n) по памяти.
