算法邏輯(暴力匹配)
- 外層遍歷主串
str1 每個起始位置 i;
- 內層從
i 開始比對模式串 str2;
- 若全匹配成功,返回
str1+i;
- 主串遍歷結束未找到,返回
NULL。
代碼實現(修正版)
#include <stdio.h>
#include <assert.h>
char *my_strstr(const char *str1, const char *str2) {
assert(str1 && str2);
if (*str2 == '\0') return (char*)str1; // 空模式串匹配開頭
for (const char *p1 = str1; *p1; ++p1) {
const char *s1 = p1;
const char *s2 = str2;
while (*s1 && *s2 && *s1 == *s2) {
++s1; ++s2;
}
if (*s2 == '\0') return (char*)p1; // 找到
}
return NULL;
}
int main() {
char *s1 = "abbbcdef";
char *s2 = "bbcd";
char *res = my_strstr(s1, s2);
printf("Found at: %s\n", res ? res : "NULL");
return 0;
}
關鍵修正點
- 原代碼變量名錯誤(
s/q 未定義),已修正為 s1/s2;
- 外層循環條件
*p1 而非 *p;
- 空模式串處理:標準庫返回主串首地址。
複雜度與優化
- 時間
O(n*m),n 主串長,m 模式串長;
- 工程中長文本搜索請用 KMP (
O(n+m)) 或 Boyer-Moore;
- 本實現適合教學、短串、面試手寫場景。