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

 

转载于:https://www.cnblogs.com/iamliyou/p/5229080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值