c++ - 如何找到修改后的字符串等于原始字符串的时间
问题描述
如何解决字符串首先循环旋转 1 个字母,然后旋转 2 个字母,很快,修改后的字符串何时与原始字符串相等的问题?这些字符串仅由“a”和“b”组成。
例如:aabaab 是第一个字母旋转时的字符串,它将在第二次旋转时变为 abaaba,它将变为 aabaab,因此答案为 2。
我试图解决这个问题,但只能通过蛮力来解决。 https://pasteboard.co/HwWR6WZ.png
任何帮助将不胜感激。
解决方案
假设s
为原始字符串,您想要的是最小索引i > 0
,即s
字符串中索引处的子i
字符串ss
。你可以在这棵树中构造then search的后缀树。该算法在 O(n) 时间内运行。ss
s
例如考虑s = abab
, 的后缀树ss
, ieabababab
看起来像 ($
代表一个字符串的结尾)
root
ab/ \b
/ \
ab/\$ $/\ab
/ \ / \
* 6 7 $/\ab
ab/\$ / \
/ \ 5 $/\ab$
ab$/\$ 4 / \
/ \ 3 1
0 2
搜索后abab
我们到达*
节点,在其子树中有三个叶子代表索引 0,2,4。答案是其中最小的正指数,即2。
可以使用后缀数组和 LCP 数组在 O(n) 时间内构建后缀树。
推荐阅读
- php - PHP - 子类没有从父类继承
- vue.js - 如何使用 vuex 解决 v-model?
- c - 如何使用 Fork() 只创建两个子进程,它们都有下两个子进程?
- python - 使用__RequestAccessToken的python网络抓取登录不起作用
- algorithm - 描述一种递归算法来打印所有不包含任何连续 1 的 N 位二进制字符串
- reactjs - 我可以在没有 ElasticSearch 的情况下使用 ReactiveSearch 组件吗?
- javascript - 如何保持div的宽度相同?
- python - 无法使用scrapy提取网页上的json项目
- java - 如何对复杂对象进行单元测试?
- php - 提交一个捕获一些错误并保存其他数据的表单,当重新提交表单时,我将如何清除这些输入值?