以下代码返回字符串s1中的第一个位置,其中出现字符串s2中的任何字符。其最差的时间复杂度是O(m + n)。怎么样?
#include<stdio.h>
int any(char *s1, char *s2)
{
char array[256];
int i;
if (s1 == NULL) {
if (s2 == NULL) {
return(0);
} else {
return(-1);
}
}
for(i = 0; i < 256; i++) {
array[i] = 0;
}
while(*s2 != '\0') {
array[*s2] = 1;
s2++;
}
i = 0;
while(s1[i] != '\0') {
if (array[s1[i]] == 1) {
return(i);
}
i++;
}
return(-1);
}
答案 0 :(得分:4)
它分两步完成。
它初始化一个大小为256的数组(表示其输入字符串的每个有效字符),并且对于s2中的每个字母( n ),标记字符在数组中的位置为1表示该字符存在。
它遍历s1中的字符(0到 m ),检查数组中的每个字符位置,看它是否设置为“present”(1),表明它在第二个字符串中。如果是,则返回s1中该字符的索引。如果s2中没有任何字符出现在s2中(在 m 处发现),则返回-1。
由于步骤1始终采用 n (s2的长度),步骤2将采用 m (s1的长度),最坏的情况是O (m + n),仅在没有匹配时发生,或者在s2中仅存在s1中的最后一个字符。