如何在O(1)复杂度(运行时)中反转字符串?

时间:2017-05-19 20:49:54

标签: algorithm

我今天接受了采访,并被要求在单一操作中反转一个字符串。我觉得这不可能在 O(n)之内。顺便说一句,我得到了一个线索,“交换”!所以。 。 。有没有答案?

  • 示例输入:“abcdefghi”(或任何字符串)
  • 示例输出:“ihgfedcba”
  • 不能使用内置功能。 (例如:strrev()
  • 答案并不像反向打印/迭代那样棘手。

3 个答案:

答案 0 :(得分:1)

您无法在O(N)时间内撤消字符串,但是,您可以使用O(1)空间复杂度来执行此操作。

  

在单个操作中反转字符串

最有可能的是reverse it in one-liner,因为它甚至不清楚什么是"操作"真的是。

您可以使用std::reverse算法reverse a string in one line

#include <string>
#include <algorithm>

int main()
{
    std::string str = "Hello world!";
    std::reverse(str.begin(), str.end());
    std::cout << "reverse is: \"" << str << '\"' << std::endl;
}

输出:

reverse is: "!dlrow olleH"

或者您也可以使用一个简单的循环来完成它:

for (size_t i=0; i<str.size()/2; ++i)
    std::swap(str[i], str[str.size()-1-i);

然而,这是O(N)运行时和O(1)空格(就像std::reverse)。

通常采访简单的反向字符串算法问题并不是关于某些技巧,很可能你的采访者想要看到这种循环的实现。此外,不要忘记面试官也是人类,有时他们只会犯错误并要求不可能。或者,他们只是想让你说不可能在O(1)中反转序列。

答案 1 :(得分:0)

反转一个字符串?只需将其从rbegin()重复到rend()即可。或std::copy范围为新字符串。 “反向字符串”与原始字符串相同,只是另读。

答案 2 :(得分:0)

你不能这样做。即使在某个地方有一些现有的功能,它内部仍然需要O(n)。虽然从技术上讲,交换的复杂性对于偶数个字符是O(n)而对于奇数个字符是O(n-1)(因此可以“技术上”说交换3个字符的字符串是O(1) )),每个操作都有点复杂,因为你必须在交换另一个时将一个交换的字符存储在局部变量中。因此,出于实际原因,交换会更慢,而不是更快。