通过执行这些操作获得回文数组

akh*_*pta 6 arrays string algorithm data-structures

如果一个数组在颠倒其元素的顺序后保持不变,则该数组被称为回文数组。

你有一个字符串数组 arr。对于每个 i,arr[i]至少包含两个字符。对于每对连续元素arr[i]arr[i + 1],您可以:

  1. 将 中最右边的字符移动arr[i]到 中最左边的位置arr[i + 1]。例如,“abc”和“def”将变为“ab”和“cdef”。此操作只能对任何一对连续元素应用一次。
  2. 将 中最左边的字符移动arr[i + 1]到 中最右边的位置arr[i]。例如,“abc”和“def”将变为“abcd”和“ef”。同样,此操作只能对任何一对连续元素应用一次。
  3. 对这对连续元素不执行任何操作。

通过执行这些操作是否可以从 arr 中获取回文数组?

考虑 arr = 时的情况{"aa", "bab", "cde", "aba", "ab"}。这里的输出应该是 true,原因如下:

将第一个字符从第 1 个索引移动到第 0 个索引的最后位置, arr ={"aab", "ab", "cde", "aba", "ab"} 将最后一个字符从第 3 个索引移动到第 4 个索引的第一个位置,arr = {"aab", "ab", "cde", "ab", "aab"},这是一个回文数组。

我尝试了诸如两个指针等解决方案,但似乎不起作用。

bti*_*lly 1

递归两个指针可能是正确的,但不是有效的解决方案。考虑一个如下所示的输入:

{"aa", "aa", ..., "aa", "bb", "cc", "aa", "aa", ..., "aa"}
Run Code Online (Sandbox Code Playgroud)

这不能变成回文,但两个指针将递归地尝试a在字符串之间移动 's 的指数数量的方法,然后再弄清楚。

但是,请按照从外到内的方式进行操作。对于数组中的每对位置,我们最多可以达到 9 个状态,而且通常更少。(每一方都可能向外部丢失了一封信,或者从外部获得了一封信,或者发生了变化。如此3*3 = 9说。)从每个状态中,我们同样可以尝试 9 种组合。任何使这一对成为回文的状态都是下一对的可能状态。

如果我们有 0 个状态,则不可能有回文。如果我们在中间相遇,那就是。对于每一对,我们最多有 81 次操作(从 9 个状态中的每一个,尝试 9 件事)来发现下一个可能的状态。因此,这不仅是正确的,而且还需要数组长度的线性时间才能找到答案。