【发布时间】:2021-04-03 04:39:00
【问题描述】:
问题是检查两个字符串是否相互旋转。所以,这是我为它写的函数:
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一定是相互旋转的。
我无法弄清楚我的代码的时间和空间复杂度。 我能理解的是它应该是 O(n) 时间复杂度,因为首先将 s1 连接到 s1,我们必须创建 s1 的副本,并且要在 s1 中找到 s2,我们必须遍历,因此时间复杂度为 O(n)。 对于空间,它也应该是 O(n),因为我们正在制作 s1 的副本。 这是正确的吗?
【问题讨论】:
-
对它的各种 N 值进行基准测试,例如 1、10、100,每次迭代上升 10 倍。您会很快发现这条曲线的形状。
-
顺便说一下,这看起来 O(N²)。我这么说是因为
find测试可能有点慢,尽管您应该运行这些数字来确定。一旦你击中长度为 N=1e6 的字符串,你就会知道。 -
提示:为什么要复制?您始终可以与长度的模进行比较。 O(N) 保证是这样的。
-
我认为是复制,因为在执行 s1+s1 之后,我们必须将其存储回 s1,由于长度加倍,我们必须将整个内容复制到 s1(就像内部实现一样向量)。
-
a[i] == b[(i + n) % l]
标签: c++ performance time-complexity space-complexity