strstr函数实现——KMP算法
功能:
返回一个指向str1中第一次出现的str2的指针,如果str2不是str1的一部分,则返回一个空指针。
不匹配空字符 ,遇到空字符即停止。
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; //p:子串 int* make_ptm(const char* p) { int len = strlen(p); int* ret = static_cast<int*>(malloc(sizeof(int) * len)); if(ret != NULL) { int length = 0; ret[0] = 0; for(int i=1; i<len; i++) { while((length>0) && (p[length] != p[i])) { length = ret[length-1]; } if(p[length] == p[i]) { length++; } ret[i] = length; } } return ret; } //s:目标字符串,p:子串 int kmp(const char* s, const char* p) { int ret = -1; int sl = strlen(s); int pl = strlen(p); int* pmt = make_ptm(p); if((pmt != NULL) && (0 < pl) && (pl <= sl)) { for(int i=0, j=0; i<sl; i++) { while((j>0) && (s[i] != p[j])) { j = pmt[j-1]; } if(s[i] == p[j]) { j++; } if(j == pl) { ret = i + 1 - pl; break; } } } free(pmt); return ret; } int main() { cout << kmp("ababax", "ax") << endl; return 0; }
上一篇:
IDEA上Java项目控制台中文乱码