【问题标题】:How to find the number of the lexicographically minimal string rotation?如何找到按字典顺序排列的最小字符串旋转的数量?
【发布时间】:2014-01-09 16:41:50
【问题描述】:

如何找到lexicographically minimal string rotation的号码?

例如:

S = abab, N = 2 S = abca, N = 1 S = aaaa,N = 4

我尝试了 Duval 的算法,它的工作时间很长。字符串长度为100000000个字符。

【问题讨论】:

  • 我不认为你想要字典上最小的字符串旋转,而是周期性字符串的周期。 stackoverflow.com/questions/8347812/…
  • 旋转次数是什么意思?每一轮都有编号吗?转数是多少?你不想要总旋转次数(rotationS - 复数)吗?
  • Duval 的算法适用于 O(N)O(1) 内存要求。如果这对你来说似乎很慢,放弃它,不会有更快的!程序至少需要读取整个字符串,这给出了最短时间O(N)
  • 你叫什么很长?你是如何实施的?使用什么语言?正确编码和优化,10^8 个元素的线性时间算法应该需要几秒钟。
  • @Tomas O(N) 并不意味着没有比这更快的了。可能还有另一种算法,其复杂度为 O(N),执行时间快 100 倍。

标签: string algorithm circular-buffer


【解决方案1】:

简单——只需确定字符串的最小周期。在最小周期K 中周期性的字符串将产生完全相同的(因此在字典上相等)的字符串,用于精确地N/K 不同的旋转,所以无论字典最小值是什么,它将是N/K 不同旋转的结果。

【讨论】:

  • 我尝试了 Duval 的算法,它的工作时间很长。字符串长度为 100000000 个字符。
  • 为什么需要 Duval 算法?确定最小排列的 number 并不需要您找到其中的 any
  • 那我怎么找到K
  • @user3164559:嗯,你说 N = 100000000 = 10^8。 K 必须是 N 的除数。N = 10^8 = 2^8 * 5^8 只有 9*9 = 81 个除数。不计算 N 本身给我们留下了 80 种可能性。那么为什么不简单地验证所有 80 种可能的旋转呢?在 O(N) 时间内验证每种可能性应该很简单。
猜你喜欢
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多