【问题标题】:What is the runtime of string::substr() in C++? [duplicate]C++ 中 string::substr() 的运行时间是多少? [复制]
【发布时间】:2012-10-05 02:14:52
【问题描述】:

可能重复:
What is the complexity of std::string::substr member function?

我正在尝试一个简单的解决常见子字符串问题的方法。为此,我首先找到第一个字符串的所有子字符串并将它们添加到哈希集中。然后,我找到第二个字符串的子字符串,看看它们是否存在于哈希集中,如果长度大于当前最大子字符串,则调整最长的子字符串。我想知道的是:就str1 的长度而言,substr 的运行时间是多少(假设str1 的长度为n)?

#include<hash_set>

string longestCommonSubstring(string str1, string str2) {
    hash_set<string> substrings;
    string maxSubstring = "";
    int maxLength = 0;

    for (int i = 0; i < str1.size(); i++) {
        for (int j = i+1; j < str1.size(); j++) {
            substrings.insert(str1.substr(i,j-i));
        }
    }

    for (int i = 0; i < str2.size(); i++) {
        for (int j = i+1; j < str2.size(); j++) {
            if (substrings.find(str2.substr(i,j-i)) != substrings.end()) {
                if (j-i > maxLength) {
                    maxSubstring = str2.substr(i,j-1);
                    maxLength = j - i;
                }
            }
        }
    }
}

【问题讨论】:

    标签: c++ algorithm substring


    【解决方案1】:

    substr 没有指定的复杂性,但string 具有恒定时间随机访问,并且substr 会生成一个给定长度的新字符串,因此基本上是复制该字符串的成本很多字符。

    请注意,GCC 使用引用计数实现 std::string(这是非法的),因此制作副本的实际成本可能因您的实现而异。

    【讨论】:

    • 好吧,说得有道理,那你说算法的运行时间是多少,O(n^3)?
    • 引用计数字符串在 C++11 中可能是非法的,但另一种方法是使链接到使用旧 GCC 构建的代码变得不可能/严重错误。
    • @ZanLynx:正确的解决方案是引入与旧的 C++98 G++ std::string 链接兼容的 __gnu_cxx::string98
    【解决方案2】:

    编辑:对不起,我误解了这个问题(我没有正确阅读这个问题)。

    时间复杂度取决于硬件,但可以合理地假设它与请求的子字符串的长度成正比。

    该函数所做的只是创建原始字符串的一部分的副本。

    【讨论】:

    • 这对于分配和复制来说似乎真的很悲观。愿意解释一下您为什么会这样认为吗?
    猜你喜欢
    • 2021-06-17
    • 2020-02-28
    • 2020-02-03
    • 2013-04-10
    • 2020-10-13
    • 1970-01-01
    • 2021-02-10
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多