malloc/free next 陣列,開銷大。void buildNext(const char* pat, int* next) {
int m = strlen(pat);
next[0] = 0;
for (int i = 1, j = 0; i < m; i++) {
while (j > 0 && pat[i] != pat[j]) j = next[j-1];
if (pat[i] == pat[j]) j++;
next[i] = j;
}
// 可選優化:若 pat[i+1] == pat[next[i]] 則 next[i] = next[next[i]-1]
}
int kmpSearch(const char* txt, const char* pat, int* next) {
int n = strlen(txt), m = strlen(pat);
int count = 0;
for (int i = 0, j = 0; i < n; i++) {
while (j > 0 && txt[i] != pat[j]) j = next[j-1];
if (txt[i] == pat[j]) j++;
if (j == m) {
count++;
j = next[j-1]; // 繼續尋找下一個匹配(允許重疊)
}
}
return count;
}
在主函式分配最大可能的 next 陣列(10000+5),各測資重用,避免重複分配。
構建 Next O(m),匹配 O(n),總計 O(n+m) 每測資,滿足 1000ms 限制。