串(String)是由零个或多个任意字符组成的有限序列。如下图所示
目录
当n=0时,为空串,与空格串不同。
一个串中任意个连续字符组成的子序列(包含空串)成为该串的子串。子串的概念类似于数学中的集合,有真子串,如下图所示
图来自于bilibili 王卓老师
具体初始化,创建等就不讲了,实际开发中不可默守陈规,关键在于学习两种算法
一、BF算法
此算法也称为简单匹配算法。实际上即是暴力穷举法,算法时间复杂度为O(n*m),为方便理解算法先看下面图解
若刚开始S[0]!=T[0],条件同样满足,因此只要S[s]!=T[t],回溯就成立。循环此步骤的条件为s,t均小于该串长度
当前面元素都满足条件S[s]==T[t],且进行到T[t]=="/0"时,代表匹配到了字符。此算法每次都要回溯因此时间复杂度为0(n*m)
代码实现如下(我以字符数组为例主要演示算法)
char S[7] = {"abcacbb"};
char T[4] = {"cacb"};
int s = 0;
int t=0;
while (s<sizeof(S)&&t< sizeof(T)) { //j范围在主串内,t范围在子串内
if (S[s]==T[t]) {
s++;
t++; //值相等则比较下一元素
}
else {
s = s - t + 1; //回溯子串主串
t= 0;
}
if (T[t]=="/0") {
return 1; //找到了
}
else {
return 0; //还未到循环结束
}
}
二、KMP算法
KMP算法主要是在回溯方面进行了优化,使得不至于傻瓜式的回溯到头,关键点在于找到最大前后缀以减少无谓的过程。
由于网上的讲法有很多,我这面主要拆分为完整过程和next数组两部分讲解,我这面归纳总结为以下几个步骤:
KMP算法流程
①前缀,后缀,最大公共前后缀 概念
②研究KMP与BF的区别 (主要是回溯)
③next数组的讲解