答案 0 :(得分:1)
考虑到我们在同一点切割了两个弦,这是一个可能的解决方案。它以线性时间而不是字符串长度运行,因此以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
的“中间部分”本身是否是回文。如果是这样,我们有解决方案,否则我们没有解决方案。