字符串:
用数值模拟非数值:ASCII码表
串:由0个或多个字符组成的有限序列
#空格也是一个字符
#子串和主串:“over”是“lover”的子串
字符相比较:比大小-ASII码大小--但并没什么意义--主要看是否相等
存储结构:与线性表相同:顺序和链式
顺序存储:事实上就是用数组
不同的字符串一般是连在一起表述的-习惯上会用数组
BF算法:(brute force)
属于朴素的模式匹配算法,核心思想是:
有两个字符串S、T,长度分别为N、M。首先S[1]和T[1]比较,相等-在比较S[2]和T[2]
,不等-T向右移动一个字符的位置,依次比较
S是主串,T是子串,效率极其低下
KMP算法:
核心:避免不必要的回溯
子串中失配前面最近的是后缀,在在前面的是前缀(第一个永远是前缀,最后的一定是后缀)
子串失配处下一次匹配处为:前缀和后缀相等的元素+1
#需要找到子串中前后缀重复的字符串个数
Next数组:当模式匹配串T失配的时候,next数组对应的元素指导应该用T串的哪个元素进行下一轮的匹配
i(后缀)j(前缀)T(0)是字符串长度
void get_next(string T,*next)
{
Next[1]=0 ;
j=0 ;
i=1;
Whlie(i<T(0))
{
if(T(i) = =t(j) || j==0)
{
//后缀是相对的,前缀是是固定的
i++;
j++;
next[i] = j;
}
else
{
j=next[j]
//j回溯
}
}
}
#KMP就是对BF算法的改善
两个算法的代码很相似,只有匹配不成功后重新匹配的点在哪里不同
KMP算法也有缺陷:效率不会是最好的,一些特殊情况下效率也比较低