分开两个字符串以形成回文

时间:2019-05-22 10:42:04

标签: algorithm data-structures puzzle

给出两个长度相等的字符串A和B,找出是否有可能在同一点切割两个字符串,以使A的第一部分和B的第二部分形成回文。 我尝试过蛮力,这可以在O(N ^ 2)中实现。我正在寻找任何一种优化。我对回溯和DP不熟悉。因此,有人可以给我一些启示吗?...我是否应该在这些方面考虑?

1 个答案:

答案 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    // <-  

如果字符串在它们各自的中部之前是等距的,则解决方案很简单。否则,我们检查AB的“中间部分”本身是否是回文。如果是这样,我们有解决方案,否则我们没有解决方案。