C ++中string :: substr()的运行时是什么?

时间:2012-10-05 02:14:53

标签: c++ algorithm substring

  

可能重复:
  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;
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

substr没有指定的复杂性,但string具有固定时间随机访问权限,substr生成给定长度的新字符串,因此它将是基本上是复制那么多字符的成本。

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

答案 1 :(得分:0)

编辑:抱歉,我误解了这个问题(我没有正确地阅读这个问题)。

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

该功能的作用仅仅是创建原始字符串的一部分副本。