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 }
能有什么困难?都是可以解决的!