Implementation:Sunday 字符串匹配

int sunday(string str, string pattern) {

    int str_len = str.length();

    int pat_len = pattern.length();

    

    int char_pos[256];

    for (int i = 0; i<256; i++) char_pos[i] = -1;

    

    for (int i = pat_len - 1; i>=0; i--) char_pos[pattern[i]] = i;

    

    int i = 0;

    int j = 0;

    

    while (i + pat_len <= str_len) {

        while (j < pat_len && str[i] == pattern[j]) {

            i++, j++;

        }

        if (j == pat_len) return i - pat_len;



        int k = i + pat_len - j;

        int p = 0;

        

        while ( k < str_len && (p = char_pos[str[k]]) == -1) {

            k += pat_len;

        }

        

        i = k - p;

        j = 0;

    }

    return -1;

}

比KMP好理解多了

参考:

http://www.cnblogs.com/lbsong/archive/2012/05/25/2518188.html

简化:

 1 int sunday(const char* pattern, const char* str) {

 2     if (pattern == NULL || str == NULL) {

 3         return -1;

 4     }

 5     int slen = 0, plen = 0;

 6 

 7     while (pattern[plen] != '\0') plen++;

 8     while (str[slen] != '\0') slen++;

 9     

10     int tbl[128];

11     for (int i=0; i<128; i++) tbl[i] = -1;

12     for (int i=0; i<plen; i++) tbl[pattern[i]] = i;

13     

14     int pi = 0, si = 0;

15     

16     while (si < slen) {

17         while (str[si] == pattern[pi] && si < slen) si++, pi++;

18         if (pi == plen) return si - plen;

19         int nidx = plen - pi + si;

20         int offset = tbl[str[nidx]];

21         si = nidx - offset;

22         pi = 0;

23     }

24     return -1;

25 }

 

你可能感兴趣的:(sun)