字符串的存储结构:
线性表:包括顺序存储、链式存储
BF算法
是一种朴素的模式匹配算法。核心思想:
——有两个字符串S和T,长度为N和M。首先S[1]和T[1]比较,若相等,则比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则T向右移动一格字符的位置,再依次比较。
核心思想是回溯,效率较低。
KMP算法
核心是避免不必要的回溯。
思路一
思路二
思路三
思路四
考虑上述四种情况,形成KMP算法。
检查失配位置,比较失配位置前的子串,子串的前缀和后缀(长度均小于字串)匹配的个数为k,则失配位置在下一次要回溯比较的字符为原字符串的第k+1个字符(这里假设字符串从1开始计数,如果第一个字符就不匹配,则该位置下一次与第0个字符,即空字符作比较,也即字符串向右移动一位)
这里称k数组为next数组,加速信息,即数组 next 的提取是整个 KMP 算法中最核心的部分,求next数组的方法:
代码实现
//***********获得next数组的代码********
int j=0;
int i=1;
next[1]=0;
while (i<T[0]) // T[0] 用来记录整个字符串长度
{
if (j==0 || T[i] == T[J])
{
i++;
j++
next(i)=j;
}
else
{
//回溯
j = next(j);
}
}
前缀是固定的,后缀是相对的。