實現 int fun(char *s1, char *s2),統計 s2 在 s1 中出現次數,不重疊計數。
int fun(char *s1, char *s2) {
int i, j, len1 = strlen(s1), len2 = strlen(s2), n = 0;
for (i = 0; i <= len1 - len2; i++) { // 外層:滑動窗口起始位置
for (j = 0; j < len2; j++) { // 內層:逐字符比較
if (*(s1 + i + j) != *(s2 + j)) break; // 指針算術訪問
}
if (j == len2) { // 完全匹配
i += j - 1; // 跳過已匹配部分(關鍵優化)
n++;
}
}
return n;
}
| 代碼行 | 含義 |
|---|---|
len1 = strlen(s1) | 主串長度 |
len2 = strlen(s2) | 子串長度 |
i <= len1 - len2 | 窗口不越界:剩餘長度至少容納子串 |
*(s1 + i + j) | 主串第 i+j 個字符(指針算術) |
*(s2 + j) | 子串第 j 個字符 |
if (...) break | 失配立即跳出內層循環 |
if (j == len2) | 內層正常結束 → 完全匹配 |
i += j - 1 | 外層 i 自增 1,加上這裡共跳過 j 字符,避免重疊匹配 |
n++ | 計數器加一 |
s1 = "abaaAabcaabbabca", s2 = "ab" → n = 4
s1 = "abaaAabcaabbabca", s2 = "abd" → n = 0 (輸出 "No find")
大數據量建議 KMP、Boyer-Moore 或 Sunday 算法,將時間降至 O(n+m)。