数算 3
字符串
顺序表示
1 struct SeqSting{ 2 int MAXNUM; 3 int n; 4 char *c; 5 }; 6 typedef struct SeqString *PSeqString;
链接表示
1 struct StrNode; 2 typedef strct StrNode *PStrNode; 3 struct StrNode{ 4 char c; 5 PStrNode link; 6 }; 7 typedef struct StrNode *LinkStrNode;
模式匹配问题
1 struct SeqString{ 2 int MAXNUM; 3 int n; 4 char *c; 5 }; 6 typedef struct SeqString *PSeqString; 7 8 int index (PSeqString p, PSeqString q){ 9 int i=0, j=0; 10 while (i<p->n &&j< q->n){ 11 if (p->c[i]==q->c[j]){ 12 i++;j++; 13 } 14 } 15 else { 16 j=j-i+1; 17 i=0; 18 } 19 if (i>=p->n) 20 return (j-p->n+1); 21 else 22 return 0; 23 }
1 makeNext(PSeqString p, int *next){ 2 int i=0, k=-1; 3 next[0]=-1; 4 while (i<p->n-1){ 5 while (k>=0&&p->c[i]!=p->c[k]) 6 k=next[k]; 7 i++; 8 k++; 9 next[i]=k; 10 } 11 }
简单,易于理解,但是效率不高。算法运行时间是 O(m*n).
makenext 函数可以修改的更好。
1 makeNext (PSeqString p, int *next){ 2 int i=0, k=-1; 3 next[0]=-1; 4 while (i<p->n-1){ 5 while (k>=0 && p->c[i]!=p->c[k]) 6 i++;k++; 7 if (p->c[i]==p->c[k]) next[i]=next[k]; 8 else next[i]=k; 9 } 10 }