使用O(N)就地旋转字符串

时间:2013-10-11 10:49:41

标签: string algorithm optimization

我遇到了一个简单的(我认为)旋转字符串的练习:

  

用K字符旋转字符串表示从中剪切这些字符   开始并将它们转移到最后。如果K是负数,   字符,相反应该从最终转移到   开始。

我立刻发明了使用两个子串串联的解决方案。但是,我发现了以下内容:

  

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

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

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

但它看起来太笨拙了。

1 个答案:

答案 0 :(得分:4)

让我们看看它旋转6个字符:

Original: 123456789
Desired:  789 123456

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

987 654321

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

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

在线性时间内就地转换字符串很容易。

这是最近提出的另一个问题的重复,回答它似乎比找到副本更省力 - 我只是制作这个社区维基。