本文转载http://blog.youkuaiyun.com/feixiaoxing/article/details/6911730
下面的代码是优化前的代码,现在再贴一次,这样分析起来也方便些:
- char* strstr(const char* str, char* data)
- {
- int index;
- int len;
- if(NULL == str || NULL == str)
- return NULL;
- len = strlen(data);
- while(*str && (int)strlen(str) >= len){
- for(index = 0; index < len; index ++){
- if(str[index] != data[index])
- break;
- }
- if(index == len)
- return (char*) str;
- str++;
- }
- return NULL;
- }
- int check_length_of_str(const char* str, int len)
- {
- int index;
- for(index = 0; index < len; index ++){
- if('\0' == str[index])
- return 0;
- }
- return 1;
- }
- char* strstr(const char* str, char* data)
- {
- int index;
- int len;
- if(NULL == str || NULL == str)
- return NULL;
- len = strlen(data);
- while(*str && check_length_of_str(str, len)){
- for(index = 0; index < len; index ++){
- if(str[index] != data[index])
- break;
- }
- if(index == len)
- return (char*) str;
- str++;
- }
- return NULL;
- }
- char* strstr(const char* str, char* data)
- {
- int index;
- int len;
- if(NULL == str || NULL == str)
- return NULL;
- len = strlen(data);
- if((int)strlen(str) < len)
- return NULL;
- while(*str){
- for(index = 0; index < len; index ++){
- if(str[index] != data[index])
- break;
- }
- if(index == len)
- return (char*) str;
- if('\0' == str[len])
- break;
- str++;
- }
- return NULL;
- }
(二)、KMP算法
KMP算法本质上说是为了消除查找中的多余查找步骤。怎么就产生了多余的查找步骤了呢。我们可以用示例说话。假设有下面两个字符串:
A: baaaaabcd
B: aaaab
那么这两个查找的时候会发生什么现象呢?我们可以看一下:
- /* 1 2 3 4 5 6 7 8 9
- * A: b a a a a a b c d
- * B: a a a a b
- * 1 2 3 4 5 6 7 8 9
- */