C 函数 strstr 的高效实现
2014-06-20 17:37
253 查看
C函数库中有一个函数 strstr(char*, char*),它实现的是在一个原字符串中查找一个子串,如果找到这样的一个子串,返回这个子串在原字符串中的起始位置,若没有找到这样的一个子串,则返回NULL。
但是,函数库中实现的仅是一般情况下的查找,即没有做太多优化,在执行一些特殊的字符串时效率很低,所以,在很多面试中要求改进这个算法,实现效率高的 strstr 算法,这里,我对原算法进行几处改动,在对某些特殊测试用例时,执行效率确实比原算法高出许多,这里,贴出实现代码,改动的地方在实现中已有注释,当然,各位朋友有更高效率的实现方法,请不要吝啬您的指教:
代码如下所示:
但是,函数库中实现的仅是一般情况下的查找,即没有做太多优化,在执行一些特殊的字符串时效率很低,所以,在很多面试中要求改进这个算法,实现效率高的 strstr 算法,这里,我对原算法进行几处改动,在对某些特殊测试用例时,执行效率确实比原算法高出许多,这里,贴出实现代码,改动的地方在实现中已有注释,当然,各位朋友有更高效率的实现方法,请不要吝啬您的指教:
代码如下所示:
#include <cstring> #include <iostream> #include <cassert> using namespace std; char* my_strstr(char* str, char* sub) { assert(str != NULL); assert(sub != NULL); int str_len = strlen(str); int sub_len = strlen(sub); if (str_len < sub_len) /*不用比较,肯定不是*/ { return NULL; } if (str_len != 0 && sub_len == 0) /*aaaaaaaaaaaaaaaaaa, "" ,比较需要花费时间很多*/ { cout << "子串为空。。。" << endl; return NULL; } if (str_len == 0 && sub_len == 0) /*都为空可以直接返回*/ { cout << "原串和子串都为空 !" << endl; return str; } for (int i = 0; i != strlen(str); ++i) { int m = 0, n = i; cout << "原串剩余的长度 : " << strlen(str + i) << endl; cout << "子串的长度 : " << sub_len << endl; if (strlen(str + i) < sub_len) /*往后找如果原串长度不够了,则肯定不是*/ { cout << "子串太长啦。。。" << endl; return NULL; } if (str == sub[m]) { while (str[n++] == sub[m++]) { if (sub[m] == '\0') { return str + i; } } } } return NULL; }
相关文章推荐
- C 函数 strstr 的高效实现
- strstr()函数原型实现
- strcpy,strcat,strcmp,strstr 实现函数
- strstr和memcmp函数的实现
- Linux中strchr与strstr函数实现。
- strchr(),strstr()函数实现
- SQL Server 2005: 利用新的ranking函数实现高效的数据分页操作
- strstr()函数实现
- 实现c语言strstr函数功能
- 一个自己实现的strstr 字符串查找函数,大家看看有什么错误和改进的地方
- strstr()函数的实现
- 编写实现strstr()函数功能的代码
- strstr函数实现
- C标准库函数实现之strstr
- strstr和memcmp函数的实现
- c 中实现 replace 函数以及strstr两个函数的实现
- c 重要库函数实现!strcmp strcpy strlen strstr
- 自定义实现字符串处理函数 strlen strcmp strcpy strncpy strcat strncat strchr strstr
- [转] javascript另类方法高效实现htmlencode()与htmldecode()函数
- strcpy strcat strcmp strstr函数实现