【问题标题】:Rotate String in-place with O(N)使用 O(N) 就地旋转字符串
【发布时间】:2013-10-11 10:49:40
【问题描述】:

我遇到了一个简单的(如我所想的)旋转字符串练习:

将字符串旋转K个字符意味着将这些字符从 开始并将它们转移到最后。如果 K 为负, 字符,相反应该从末尾转移到 开始。

我立即发明了使用两个子字符串连接的解决方案。但是,我发现了以下补充:

如果您想要更严峻的挑战,我们鼓励您“就地”进行轮换

任务来自 here - 确保这不是我的大学作业等

我看不到任何简单的方法来做到这一点(我想应该有 O(N) 算法)。如果我将第 0 个字符复制到临时变量并将第 K 个字符复制到它的位置,然后将第 2K 个字符复制到第 K 个的位置等等 - 如果 K 和字符串长度是互质的,我将成功。我想我可以管理其他 Ks 添加外部循环以重复从第 1 个字符到第 2 个字符的过程 - 我认为直到 GCD(K, strlen(S))

但它看起来太笨拙了。

【问题讨论】:

  • 您想要 O(n) 空间复杂度(内存中的 n 个字符串)还是 O(n) 时间复杂度(基本上每个字符一个操作),还是两者兼有?
  • “就地”是指 O(1) 空间复杂度,所以 O(N) 当然是时间复杂度。感谢您的澄清!

标签: string algorithm optimization


【解决方案1】:

让我们看一下将其旋转 6 个字符:

Original: 123456789
Desired:  789 123456

现在看看当我们反转所需字符串的两个部分时会发生什么:

987 654321

这只是原始字符串的反面。

所以,我们需要做的是先反转字符串,然后反转两个部分。

在线性时间内原地反转字符串很容易。

这是最近提出的另一个问题的副本,回答它似乎比找到副本更容易 - 我会制作这个社区 wiki。

【讨论】:

  • 哦,我现在明白了。这真的很酷,谢谢!我想,换句话说,我们可以反转字符串两次——第一次是关于它的中心,第二次是关于center + K/2——我会检查这个......
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多