数算 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 }
View Code
 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 }
View Code

简单,易于理解,但是效率不高。算法运行时间是 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 }

 

posted @ 2016-03-03 15:16  liyouvane  阅读(134)  评论(0编辑  收藏  举报