Вот возможное решение, учитывая, что мы обрезаем 2 строки в общей точке. Он работает за линейное время с длиной строки, поэтому в O(n)
.
// Palindrome function
function is_pal(str) {
str_len = len(str)
result = true
for i from 0 to 1 + str_len / 2 {
if str[i] != str[str_len - i] then {
result = false
break
}
}
return result
}
// first phase: iterate on both strings
function solve_pb(A, B) {
str_len = len(A)
idx = 0
while A[idx] == B[str_len - idx - 1] {
idx += 1
}
if idx >= str_len / 2 {
return str_len / 2
else if is_pal(A[idx + 1 ... str_len - idx - 2]) {
return str_len - idx - 2
else if is_pal(B[idx + 1 ... str_len - idx - 2]) {
return idx
else
return -1 // no solution possible
Принцип следующий:
Сначала мы выполняем итерацию по A, и обратную итерацию по B, если они «симметричны».
A: aaabcaabb ............ // ->
B: ............ bbaacbaaa // <-
Если струны симметричны до середины, то решение тривиально. В противном случае мы проверяем, является ли «средняя часть» A
или B
палиндромом. Если это так, у нас есть решение, в противном случае у нас нет решения.