字符串模式匹配
在主串中找到模式串相同的子串,并返回其所在的位置。
子串和模式串的区别
子串:主串的一部分,一定存在
模式串:不一定能在主串中找到
字符串模式匹配
朴素模式匹配算法
主串长度为n,模式串长度为m
朴素模式匹配算法:将主串中所有长度为m的子串(最多对比n-m+1个子串)依次与模式串对比,直到找到一个完全匹配的子串,或所有的子串都不匹配为止
index定位操作就是使用朴素模式匹配算法实现的
使用数组下标匹配
// 函数Index:在主串S中查找子串T的位置
// 返回值:如果找到子串,返回子串在主串中的位置(从1开始计数)
// 如果没有找到,返回0
int Index(SString S, SString T) {
int i = 1, j = 1;
while (i <= S.length && j <= T.length) {
if (S.ch[i] == T.ch[j]) {
++i; ++j; // 如果当前字符匹配,继续比较下一个字符
} else {
i = i - j + 2; // i回退到下一个可能的子串的起始位置
j = 1; // j重置为1,重新开始匹配
}
}
if (j > T.length)
return i - T.length; // 如果找到子串,返回子串在主串中的位置
else
return 0; // 如果没有找到子串,返回0
}
设主串长度为n,模式串长度为m,则最坏时间复杂度=O(nm)
最坏的情况,每个子串都要对比m个字符,共n-m+1个子串,复杂度=O((n-m+1)m)=O(nm)
注:很多时候,n>>m