C 函式 strstr 的高效實現
阿新 • • 發佈:2019-01-30
C函式庫中有一個函式 strstr(char*, char*),它實現的是在一個原字串中查詢一個子串,如果找到這樣的一個子串,返回這個子串在原字串中的起始位置,若沒有找到這樣的一個子串,則返回NULL。
但是,函式庫中實現的僅是一般情況下的查詢,即沒有做太多優化,在執行一些特殊的字串時效率很低,所以,在很多面試中要求改進這個演算法,實現效率高的 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[n] == sub[m]) { while (str[n++] == sub[m++]) { if (sub[m] == '\0') { return str + i; } } } } return NULL; }