任何人都可以帮我计算以下的复杂程度吗? 我已经为家庭作业写了一个strStr函数,虽然它不是我作业的一部分,但我想弄清楚它的复杂性。
基本上它需要一个字符串,找到第一次出现的子串,返回它的索引,
我相信它是O(n),因为虽然它最多只是双循环,但它只会运行n次,其中n是s1的长度,我是否正确?
int strStr( char s1[] , char s2[] ){
int haystackInd, needleInd;
bool found = false;
needleInd = haystackInd = 0;
while ((s1[haystackInd] != '\0') && (!found)){
while ( (s1[haystackInd] == s2[needleInd]) && (s2[needleInd] != '\0') ){
needleInd++;
haystackInd++;
}
if (s2[needleInd] == '\0'){
found = true;
}else{
if (needleInd != 0){
needleInd = 0;
}
else{
haystackInd++;
}
}
}
if (found){
return haystackInd - needleInd;
}
else{
return -1;
}
}
答案 0 :(得分:3)
确实是O(n),但它也没有正常运作。考虑在“nanand”中找到“nand”
虽然有问题的O(n)解决方案。
答案 1 :(得分:2)
实际上,外循环可以运行2n次(每次迭代递增haystackInd至少一次或者它将needleInd设置为0,但是在2次连续迭代中从不将needleInd设置为0),但是你最终会得到相同的O(n )复杂性。
答案 2 :(得分:0)
您的算法不正确。您的解决方案中的索引haystackInd不正确。但基于错误算法的结论是正确的。它是O(n),但只是找不到第一次出现的子串。最简单的解决方案与您的相似,将字符串S2与从S1 [0],S1 [1]开始的子串进行比较,......运行时间为O(n ^ 2)。如果你想要O(n)一个,你应该检查KMP算法作为上面提到的templatetypedef。