对串的学习

今天对串进行了简单的学习,把一些我觉得重要的东西写一写。


串的index操作

index(S, T, pos):
串S和串T存在,T是非空串, 1 <=pos<=StrLength(S)
若主串中含有和T相同的子串, 则返回它在主串S中第一次出现的位置, 否则返回0。

int Index(String S,, String T, int pos)  
{  
int n, m, i;  
String sub;  
if (pos > 0)  
{
    n = StrLength(S);
    m = StrLength(T);
    i  = pos;
    while(i <= n-m+1)
    {
        SubString(sub, S, i, m);/* 取主串第i个位置,长度为T的子串给sub*/
        if(StrCompare(sub, T) != 0)
            ++i;
        else
        return i;
    }
}
    return 0;
}

串的模式匹配-KMP算法

KMP算法是利用了串的前缀和后缀来减少没必要的回溯,举个例子:

主串:abcabxabx
子串:abcabc
当子串c与主串x不匹配但是c前面和x前面都拥有后缀ab与前缀ab, 所以下一次用子串的前缀ab匹配主串的后缀ab即可,这样就可以大大减少回溯,节省时间。

其实就是算出next[j]数组的值问题就解决了
算法如下(神奇的五行代码)

int GetNext(char ch[],int cLen,int next[]) {
next[1] = 0;
int i = 1,j = 0;
while(i<=cLen){
    if(j==0||ch[i]==ch[j]) next[++i] = ++j;
    else j = next[j];
}

}
看这个视频挺好
https://www.bilibili.com/video/av3246487/