algorithm - 将新字符添加到回文。检查新字符串是否仍然是回文的有效或动态方法?

标签 algorithm palindrome

假设我有一个回文s,为了好玩,我将继续在s 的末尾追加字符。但是一旦 s 不再是回文,我就想停下来。

现在我比较懒,所以不想每次在s后面追加一个新字符的时候,都重新扫描s来判断是不是回文。我想知道是否有更快的方法来公式化/检查新的 s 是否是回文,利用 s 已经是回文的事实。我觉得有一种方法可以利用这些信息,但我不能完全理解它。


我陷入了思考过程。到目前为止,我正在尝试将事情分解为案例。

回文s可以有两种形式:(|__M__|s的子串部分和|__- M__||__M__| 的反转)

当长度为奇数时:

|__-M__|X|__M__|

当长度为偶数时:

|__-M__||__M__|

现在当我附加新字符 c 时是否有一种有效的方法来检查

|__-M__|X|__M__|c <---- 回文?

|__-M__||__M__|c <---- 回文?

最佳答案

从评论中形式化相同字符的猜想:

如果字符串 S 中具有 N 个字符的字符并非都相同,则必须有:

  • 在索引 P1 处的字符 C1,后跟在 P1+1 处的不同 C2
  • C1 位于镜像索引 N-1-P1,前面是 C2 位于 N-2-P1

将任何单个字符添加到 S 后,现在必须有:

  • P1 处的字符C1,后跟P1+1 处的C2
  • C1 在镜像索引处,现在是 N-P1,前面是 C2N-1-P1

因此,N-1-P1 处的字符必须是C1(扩展前)和C2(扩展后)这是不可能的,因为我们说过它们是不同的。

因此,只有当原始字符串是一个字符的重复时,才有可能逐个字符地扩展它并保持其为回文。

关于algorithm - 将新字符添加到回文。检查新字符串是否仍然是回文的有效或动态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48017816/

相关文章:

java - 计算无向图中无序对的数量

arrays - 从数组元素创建列表,生成数字序列

java - 如何获取所有列表的列表,其中恰好包含列表列表的每个列表的一个元素

c++ getline函数不允许我输入

javascript - 使用循环查找下一个回文

算法分析 - 是否有任何算法具有 n^99 数量级的最佳情况复杂度?

string - 给定一个单词,将其转换为回文,并添加最少的字母

c++ - 如何在不使用额外空间的情况下检查双向链表是否为回文?

python - 如何返回对函数的递归调用?

java - 生成两个相同的随机数和一个不同的随机数