验证字符串是否是旋转回文的有效方法?

2023-11-22

旋转回文就像“1234321”、“3432112”。 最简单的方法是将字符串切成不同的部分,然后将它们连接起来,看看该字符串是否是回文。 这将需要 O(n^2),因为有 n 次切割,并且对于每次切割,我们需要 O(n) 来检查字符串是否是回文。 我想知道是否有比这更好的解决方案。 我想是这样,请指教。

Thanks!


根据这篇维基百科文章,每个长度为 n 的字符串 S 可以在 O(n) 时间内计算出相同大小的数组 A,这样:

A[i]==1 当且仅当 S 的长度为 i 的前缀是回文。

http://en.wikipedia.org/wiki/Longest_palindromic_substring

该算法应该可以在以下位置找到:

Manacher, Glenn (1975),“一种新的线性时间“在线”算法 找到字符串的最小初始回文”

换句话说,我们可以在线性时间内检查字符串的哪些前缀是回文。我们将使用这个结果来解决所提出的问题。

每个(非旋转)回文 S 具有以下形式 S = psxs^Rp^R。

其中“x”是回文的中心(空字符串或一个字母字符串), “p”和“s”是(可能为空)字符串,“s^R”表示“s”字符串反转。

从该字符串创建的每个旋转回文都具有以下两种形式之一(对于某些 p):

  1. sxs^Rp^Rp
  2. p^Rpsxs^R

这是真的,因为您可以选择是否在回文中间之前或之后剪切一些子字符串,然后将其粘贴到另一端。

可以看出,子串“p^Rp”和“sxs^R”都是回文,其中一个为偶数长度,另一个为奇数长度,当且仅当 S 为奇数长度。

我们可以使用维基百科链接中提到的算法来创建两个数组 A 和 B。数组 A 是通过检查哪些前缀是回文而创建的,B 是后缀。然后我们搜索一个值 i 使得 A[i]==B[i]==1 使得前缀或后缀的长度为偶数。我们将找到这样的索引,当且仅当建议的字符串是旋转回文并且偶数部分是“p^Rp”子字符串时,因此我们可以通过将该字符串的一半移动到字符串的另一端来轻松恢复原始回文。


rks 对解决方案的一点评论是,该解决方案不起作用,对于字符串 S = 1121,它将创建字符串 11211121,该字符串的回文长度大于或等于 S 的长度,但它不是旋转回文。如果我们改变解决方案,检查是否存在长度等于 S 长度的回文,它会起作用,但我没有看到任何直接的解决方案如何改变搜索最长子串的算法,使其能够将搜索固定长度 (len(S)) 的子字符串。 (我没有将其写为解决方案下的评论,因为我是 Stackoverflow 的新手,并且没有足够的声誉来这样做)


第二句话——很抱歉没有包含 Manacher 的算法,如果有人有该算法的想法或某些实现的链接,请在评论中包含它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

验证字符串是否是旋转回文的有效方法? 的相关文章

  • 如何优化分割重叠范围?

    我编写的这个 Python 脚本用于将重叠范围拆分为唯一范围 最后一次迭代 https codereview stackexchange com questions 285932 python script to split overlap
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 如何高效生成总和在指定范围内的所有组合(在所有深度)

    假设您有一组值 1 1 1 12 12 16 如何生成总和在预定义范围内的所有可能组合 不重复 min max 例如 这里是 所有深度的 范围在13 and 17 1 12 1 1 12 1 1 1 12 16 1 16 这假设具有相同值的
  • 用于计算有向图上非循环路径数量的快速算法

    简而言之 我需要一个fast计算简单有向图中有多少条非循环路径的算法 By simple我的意思是没有自环或多重边的图 Apath可以从任何节点开始 并且必须在没有传出边的节点上结束 一条路径是acyclic如果没有边出现两次 我的图 经验
  • 查找一个二维矩阵是否是另一个二维矩阵的子集

    最近我参加了一个黑客马拉松 我了解到一个问题 试图在 2d 矩阵中找到网格形式的模式 模式可以是 U H 和 T 并由 3 3 矩阵表示 假设我想展示 H 和 U 1 0 1 1 0 1 1 1 1 gt H 1 0 1 gt U 1 0
  • 依次构建完整的 B 树

    如果我有一组排序的数据 我想以最适合顺序读取和随机查找的方式将其存储在磁盘上 那么 B 树 或其中一个变体 似乎是一个不错的选择 假设该数据集并不全部适合 RAM 问题是可以从一组排序的数据构建完整的 B 树而不进行任何页面拆分吗 这样排序
  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • Diamond-Square 算法的平滑问题

    我正在使用菱形方形算法来生成随机地形 它工作得很好 除了我让这些大圆锥形状要么伸出或伸入地形 问题似乎在于 时不时会有一个点被设置得太高或太低 Here is a picture of the problem And it can be b
  • 求一根棒可以切割的最大片数

    这是完整的问题陈述 给定一根长度为n的绳子 你需要找到最大的绳子数你可以让每一段的长度都在集合 a b c 中给定三个值a b c 我知道可以通过动态规划来实现最优解 但是 我还没有学过这个主题 我需要递归地解决这个问题 对于递归 主要的事
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 计算总和等于 k ​​的子集数量

    给定一个数组 我们需要找出总和恰好等于给定整数 k 的子集的数量 请针对这个问题提出一个最佳算法 这里不需要实际的子集 只需计数即可 该数组由整数组成 可以是负数也可以是非负数 例子 数组 gt 1 4 1 10 5 绝对值总和 gt 9
  • 递归:n项级数之和

    需要递归函数 系列是 1 2 3 3 4 5 4 5 6 7 递归求 n 的级数之和 我无法想到应该在函数中传递哪些参数 我的方法 我认为我应该传递 n 要相乘的项数 但我无法想到的是我应该如何在同一个函数中 和 以及我的 return 语
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • 插入排序 - 如何接受输入并打印排序后的数组

    我试图做一个插入排序程序 它接受任何数据类型 Int Double String 然后打印排序后的数组 我知道我的代码可以工作 但我无法找出真正的问题 import java util public class MyInsertionSor
  • Python 将字符串组合成尽可能短的字符串?

    如果我有一个字符串列表 我想将它们组合成一个具有重叠字符的字符串 如果没有剩余的重叠字符串 请将其添加到末尾 这是一个过于简化的版本 input one two output twone 我正在寻找一种方法来对输入列表中的任意数量的字符串执
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g

随机推荐

  • 在 Django 模型中表示工作日的多选字段

    我一直在寻找一种优雅的方式来在 Django 模型中表示多选工作日字段 周一 周二 周三 我最初考虑使用按位数学来处理整数字段 但我不确定这是否是正确的方法 这将是一个最常被阅读的领域 我希望 Queryset 方法类似于Entry obj
  • 如何在Android中从网络加载React Native JS包?

    对于我的 Android 应用程序 我需要能够在运行时动态更新捆绑包 并使用资产中预先保存的捆绑包作为后备 我在官方文档 在 iOS 版本的 React Native 中 有一个方法可以让你指定一个 URL 来加载 JS 包 但我还没有看到
  • Cordova + Angularjs + 设备就绪

    我正在使用 Cordova 和 AngularJS 开发移动应用程序 如何在 Cordova 设备准备就绪之前限制 AngluarJS 的引导 基本上我不想在设备准备好之前使用任何 AngularJS 控制器 手动引导您的 Angular
  • 如何排除调试代码

    假设我有一个简单的记录器 void main var logger new MyLogger logger log hello Dart 我希望这段代码在开发模式 虚拟机检查模式 下运行 但我不希望它出现在我的生产代码中 我希望它能被 da
  • 3NF 和 BCNF 的简单区别(必须能够向 8 岁的孩子解释)

    我读过这句话 数据取决于密钥 1NF 整个密钥 2NF 仅取决于密钥 3NF 但是 我无法理解 3 5NF 或 BCNF 因为它被称为 这是我的理解 BCNF比3NF更严格 表中任何 FD 的左侧必须是超级键 或至少是候选键 那么为什么有些
  • openpyxl - 调整列宽大小

    我有以下脚本 它将 CSV 文件转换为 XLSX 文件 但我的列大小非常窄 每次我都必须用鼠标拖动它们来读取数据 有谁知道如何设置列宽openpyxl 这是我正在使用的代码 usr bin python2 6 import csv from
  • PopupWindow $BadTokenException:无法添加窗口 - 令牌 null 无效

    显示 PopupWindow 时出现以下错误 错误由以下行触发 checkInPopup showAtLocation ViewGroup mapView getParent Gravity CENTER HORIZONTAL 0 0 ma
  • 如何在 Clojure 中创建随机数的惰性序列

    如何创建随机数的惰性序列 我当前的代码 import java util Random def r new Random defn rnd nextInt r 10 defn random numbers max iterate nextI
  • 动态数据库模式[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 为动态逻辑数据库模式提供存储的推荐架构是什么 澄清一下 如果系统需要为模型提供存储 而模型的模式在生产中可能会被用户扩展或更改 那么有哪些好的技术 数据库模型或存储引擎可以实现这一点 几种
  • 如何将颜色名称转换为 3 元素 RGB 向量?

    在许多 MATLAB 绘图函数中 您可以将颜色指定为字符串或直接列出红色 绿色和蓝色值的三元素向量 例如 这两个语句是等效的 plot x y Color r plot x y Color 1 0 0 可以通过字符串值指定 8 种颜色 r
  • 如何在 C# 中获取原始 TCP 数据包?

    我想接收原始 TCP 数据包 然后以相同的工作负载将其发回 它应该看起来像这样 void OnPacketReceived TcpPacket p byte body p GetBody 注意 我需要 TCP 数据包而不是以太网帧 如果将套
  • 如何为 PyQt5 构建 Qt WebEngine?

    Qt 网络引擎此链接显示 Qtwebengine 的 python 包装器 请问谁能告诉我如何在 pyqt5 环境中添加这个 谢谢 看来我已经成功了 要么安装pyqt版本 5 10 仍然附带 Web 引擎 安装更新的版本 我使用 5 12
  • TYPO3 v10 持久性映射

    TYPO3 v10 改变了映射持久性类的方式 老方法看起来像这样 config tx extension extension persistence classes Vendor ExtensionExtend Domain Model O
  • json_decode 返回字符串类型而不是对象

    我将 JSON 编码的字符串传递给json decode 我期望它的输出是对象类型 但我得到的是字符串类型 我怎样才能返回一个对象 在文档中 以下内容返回一个对象 json a 1 b 2 c 3 d 4 e 5 var dump json
  • Click 中没有名称的命令

    我想要一个命令行工具 其用法如下 program
  • GetMonthName:有效值介于 1 和 13 之间(包含 1 和 13)。为什么?

    我不小心将 0 传递给了DateTimeFormatInfo s GetMonthName method DateTimeFormatInfo info new DateTimeFormatInfo var monthName info G
  • 从加载的WebView获取HTML代码[重复]

    这个问题在这里已经有答案了 我有这样的东西 final WebView w WebView findViewById R id webView1 w loadUrl http somepage com 有什么方法可以获取 WebView 中
  • Meteor:通过_id从集合中查找对象

    我正在尝试使用 Meteor 通过 id 查找对象 这是我尝试过的 Meteor publish gifts function gid console log Looking for gid var gifts Gifts find id
  • pg_dump:如何在 Amazon Linux 上安装 PostgreSQL 9.5.2?

    我曾经安装并执行以下操作 sudo yum install y postgresql94 server postgresql94 pg dump h name of db us east 1 rds amazonaws com U user
  • 验证字符串是否是旋转回文的有效方法?

    旋转回文就像 1234321 3432112 最简单的方法是将字符串切成不同的部分 然后将它们连接起来 看看该字符串是否是回文 这将需要 O n 2 因为有 n 次切割 并且对于每次切割 我们需要 O n 来检查字符串是否是回文 我想知道是