字符串::substr() 在 C++ 中的运行时是什么

What is the runtime of string::substr() in C++?

本文关键字:是什么 C++ 运行时 substr 字符串      更新时间:2023-10-16

可能的重复项:
std::string::substr 成员函数的复杂性是多少?

我正在尝试对常见的子字符串问题进行朴素的解决方案。 为此,我首先找到第一个字符串的所有子字符串并将它们添加到哈希集中。 然后,我找到第二个字符串的子字符串,看看它们是否存在于哈希集中,如果长度大于当前最大子字符串,则调整最长的子字符串。 我想知道的是:就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;
                }
            }
        }
    }
}

substr 没有指定的复杂性,但string具有恒定时间随机访问,并且substr创建一个给定长度的新字符串,因此它本质上是复制那么多字符的成本。

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

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

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

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