字符串是由零个或多个字符组成的有限序列。
基本操作
StrAssign(&T,chars):赋值操作。
StrCopy(&T,S):复制操作。
StrEmpty(S):判空操作。
StrLength(S):求串长。
Clear String(&S):清空操作。
Destroy String(&S):销毁串。
Concat(&T,S1,S2):串连接。
SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。
bool SubString(SString &Sub,SString S,int pos,int len){ //子串范围越界 if(pos+len-1>S.length) return false; for(int i=pos;i<pos+len;i++) Sub.ch[i-pos+1]=S.ch[i]; Sub.length = len; return true; }
Index(S,T):定位操作。若主串中存在与串T值相同的子串,则返回他在主串S中第一次出现的位置;否则函数值为0;
int index(SString S,SString T){ int i=1 , n=StrLength(S), m=StrLength(T); SString sub; while(i<=n-m+1){ SubString(sub,S,i,m); if(StrCompare(sub,T)!=0) ++i; else return i; } return 0; }
StrCompare(S,T):比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0;
int StrCompare(SString S,SString T){ for(int i=1;i<=S.length && i<=T.length;i++){ if(S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i]; } return S.length-T.length; }
存储结构
顺序存储
静态数组,动态数组
1.在链表末尾加上一个变量length;
2.在链表表头加一个ch[0]作为length,但是只能存储0-255字节的字符串。
3.没有length,以字符’/0‘表示结尾。
链式存储
可让每个结点存多个字符,没有字符的位置用’#‘或'\0'补足
模式匹配算法
朴素模式匹配算法-O(nm)
int Index(SString S,SString T){ int i=1,j=1; while(i<=S.length && j<=T.length){ if(S,ch[i]==T.ch[j]){ ++i,++j; } else{ i=i-j+2; j=1; } } if(j>T.length) return i-T.length; else return 0; }
KMP算法-O(m+n)
int Index_KMP(SString S,SString T,int next[]){ int i=1,j=1; while(i<S.length&&j<T.length){ if(j==0||S.ch[i]==T.ch[j]){ ++i; ++j; } else{ j=next[j]; } } if(j>T.length) return i-T.length; else return 0; }
-
求模式串的next数组
-
next[1]无脑写0;
-
next[2]无脑写1;
-