以下代码如何运行?

时间:2012-08-27 15:41:54

标签: c algorithm

以下代码返回字符串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);
}

1 个答案:

答案 0 :(得分:4)

它分两步完成。

  1. 它初始化一个大小为256的数组(表示其输入字符串的每个有效字符),并且对于s2中的每个字母( n ),标记字符在数组中的位置为1表示该字符存在。

  2. 它遍历s1中的字符(0到 m ),检查数组中的每个字符位置,看它是否设置为“present”(1),表明它在第二个字符串中。如果是,则返回s1中该字符的索引。如果s2中没有任何字符出现在s2中(在 m 处发现),则返回-1。

  3. 由于步骤1始终采用 n (s2的长度),步骤2将采用 m (s1的长度),最坏的情况是O (m + n),仅在没有匹配时发生,或者在s2中仅存在s1中的最后一个字符。