【问题标题】:Is it possible to implement an O(N) time & O(1) space solution for string cyclic shift in C++ [duplicate]是否可以在 C++ 中为字符串循环移位实现 O(N) 时间和 O(1) 空间解决方案 [重复]
【发布时间】:2020-06-08 07:51:36
【问题描述】:

给定字符串循环左移 N 个位置,比如循环左移“abcXYZdef”3 个位置,得到“XYZdefabc”。

这里我提供2个解决方案:

  1. 将字符串左移 1 个位置,并执行 N 次。
  2. 将两个字符串合并为一个,并返回特定的子字符串作为结果。

问题是:是否有可能在 O(N) 时间和 O(1) 空间内实现这样的算法?

【问题讨论】:

  • left shift the string for 1 position, and do this for N times 那么你将如何实现呢?你认为这种算法的复杂度是多少?
  • 你如何想象空间 O(N) 算法与 O(1) 时间?只需初始化内存需要 O(N)
  • 标题和正文中陈述的时间和空间复杂性不匹配。
  • @darune: O(1) 空间意味着这里:旋转算法需要额外的一堆固定大小的空间(不依赖于要旋转的字符串的大小)。
  • @KamilCuk 实现与语句本身一样简单。我认为移动 K 次时的时间复杂度会是 O(K*N)?

标签: c++ string algorithm


【解决方案1】:

这是一个理论问题,而不是一个实际问题。您的问题是 O(N) 时间和 O(1) 空间限制。

O(1) 空间限制意味着没有动态分配(即使你希望它有多小)。 这意味着我们不能为要旋转的字符提供缓冲区,也不能复制字符串输入。例如,我们可以有一个 1 char 的缓冲区(恒定分配),然后旋转一步 M 次 - 但仅旋转一次已经是 O(N)。虽然我们可以随意迭代/旋转多次,但它必须是一个恒定的次数,并且不取决于输入,否则它最终会是 O(N*M)。

如果我们一次旋转单个字符不止一步(例如,我们需要旋转 3 个位置)怎么办? - 这可能会导致可能满足要求的东西。但是接下来如何跟踪已旋转的内容(请记住,我们不能将缓冲区的大小设置为要旋转的步数 - 只能是恒定大小)。

也许这个难题可以解决,但它需要一些聪明的技巧来实现我理解它的方式,无论是数学还是其他方式。

【讨论】:

    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 2011-08-09
    • 2015-05-25
    • 2012-08-06
    • 1970-01-01
    • 2020-05-26
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多