O(1)反向字符串

时间:2019-02-26 07:35:53

标签: c++ string recursion

这是在c ++中反转字符串的最佳方法吗?

void reverseString(string &str) {

int begin = 0;
int end = str.length() - 1;

while (begin < end)
    swap(str[begin++], str[end--]);
}

是否有使用递归的更好方法?

2 个答案:

答案 0 :(得分:1)

您不必重新发明轮子,有一些有效的算法可以轻松使用而无需重新创建它们。

正如其他人所说,反转字符串或实际上任何STL容器std::reverse()都是最佳选择。

#include <algorithm> 
#include <iostream> 
#include <string> 
int main() 
{ 
    std::string foo("foo"); 
    std::string copy(foo); 
    std::cout << foo << '\n' << copy << '\n'; 
    std::reverse(copy.begin(), copy.end()); 
    std::cout << foo << '\n' << copy << '\n'; 
}

此外,您可能希望像上面的示例一样使用字符串的副本,因为已经进行了std::reverse()动作。

答案 1 :(得分:1)

根据定义,字符串的长度是任意的,这使得任何访问其元素O( N )的算法最少。

所以O( 1 )是不可能的。

您的O( N )方法是您可以获得的最好方法(std::reverse与您拥有的方法完全一样)。递归将无济于事(实际上只会使情况更糟)。


不相关的说明:您的代码有两个潜在的错误:

int end = str.length() - 1;
  1. str.length()0时将溢出(直到C ++ 20才出现未定义的行为)
  2. int大于2 GB时,str.length()将溢出