今天对串进行了简单的学习,把一些我觉得重要的东西写一写。
串的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];
}