字符串模式匹配

2019/11/30

字符串模式匹配

 

若两个串长度相等且每个对应位置的字符都相等时,称这两个串 是相等的。

 

1、定长顺序结构

1 #define MAXLEN 255
2 typedef struct{
3   char ch[MAXLEN];
4   int length;
5 }SString;

 

2、堆分配存储表示

1 typedef struct{
2   char *ch;
3   int length;
4 }

 

上面五个操作称为 最小操作子集

 

Index(S,T,pos):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第pos个字符后第一次出现的位置;

否则函数值为0。

 1 int Index(String S, String T, int pos){
 2   if(pos>0){
 3     int n = StrLength(S);
 4     int m = StrLength(T);
 5     int i = pos;
 6     String sub = NULL;
 7   while(i<b-m+1){
 8     SubString(sub,S,i,m);
 9     if(StrCompare(sub,T)!=0)
10       i++;
11     else
12       return i;
13     }
14   }
15   return 0;
16 }

 

主串S:absaaasdcbvas

串T:asd

int position = Index(S,T,2);

 

i-j+1是我们当前比较子串的第一个字符的位置

i-j+2是下移了一个位置,找到下一个可能与当前模式串相同的子串,然后进行接下来的比较。

 1 int Index(SString S, SString T,int pos){
 2   int i=pos,j=1;  //主串位置i初始化为:初始寻找位置pos,j模式串位置初始化为1
 3   while(i<=S.length && j<=T.length){  //初始位置i小于等于主串的长度&&比较的子串这个标记有没有比较到最后一个字符,如果比较到最后,就可以终止循环了。
 4     if(S.ch[i]==T.ch[j]){    //判断当前对应标记字符是否相等。
 5       i++;  //如果相等,比较下一个字符
 6       j++;
 7     }
 8     else{  //不相等,将主串中子串第一个位置的标记下移一位,
 9       i=i-j+2;  //i-j+1是当前比较子串第一个字符的位置;i-j+2是下移了一个位置,找到下一个可能与模式串相同的子串,然后进行接下来的比较。
10       j=1;  //模式串标记归1:还要从第一个位置开始比较
11     }
12     if(j>T.length)    //如果j比较到了最后一个位置,并且还是相等的,此时我们还要+1,就大于对应模式串的长度。
13       return i-T.length;    //返回对应子串位置
14     else
15       return 0;    //失败返回0
16   }
17 }

 


能有什么困难?都是可以解决的!

posted @ 2019-11-30 21:08  厸清扬  阅读(336)  评论(0编辑  收藏  举报