计算时间和 space 复杂度时遇到问题?

Problem figuring out time and space complexity?

题目是检查两个字符串是否相互旋转。所以,这是我为此编写的函数:

 bool areRotations(string s1, string s2)
        {
            int n1 = s1.length(), n2 = s2.length();
            if (n1 != n2) return 0;
            s1 += s1;
            if (s1.find(s2) != string::npos)
                return 1;
            else
                return 0;
        }

我刚刚检查了s1+s1中是否存在s2,如果存在,则s1和s2一定是互为旋转

我无法计算出我的代码的时间和space复杂度。我能理解的是它应该是 O(n) 时间复杂度因为首先要将 s1 连接到 s1,我们必须创建 s1 的副本,还要在 s1 中找到 s2,我们必须遍历,因此时间复杂度为 O(n)。 同样对于 space,它应该是 O(n),因为我们正在制作 s1 的副本。 这是正确的吗?

I am not able to figure out the time and space complexity of my code. [...] Is this correct?

std::string::length 运行s 恒定时间 (since C++11)。线性时间的比较和串联运行。但是整个算法可以在非线性时间内运行。

事实上,C++ 标准实际上并不要求任何特定算法或保证 std::string::find 的复杂性。因此,不可能独立于您使用的 STL 实现给出答案。 如果实现是天真的或使用著名的 Boyer-Moore 算法,则最坏情况下的时间复杂度可能是 O(n^2) 在您的情况下(其中 n 是输入字符串的大小)。对于 s1="aaaaaaaaaca"s2="aaaaaaaaaac" 这样的输入,可能会发生这种情况。尽管 std::search provide stronger guarantees, it does not provide any search algorithm running in linear-time. To ensure a linear-time complexity, you can use the KMP search algorithm (or better variants like the 2-way string-matching algorithm).

因此,使用 KMP 算法,您的解决方案的时间复杂度和 space 将为 O(n)。这是最佳的,因为需要读取输入字符串并将其存储在某处(至少在您的实现中)。