朴素的模式匹配
无回溯的模式匹配
- ///最大前缀和对大后缀的相等长度为k,
- ///无回溯的模式匹配即给匹配字符串上字符加上标记。
- ///长度为n的字符串char string[n]有长度为n的标记数组int flag[n]。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct seqlist;
- typedef char DataType;
- typedef struct seqlist *plist;
- struct seqlist
- {
- int maxsize;
- int n;
- DataType * element;
- };
- plist createNullList_Seq(int m)
- {
- plist pl = (plist)malloc(sizeof(struct seqlist));
- if(pl != NULL)
- {
- pl -> element = (DataType *)malloc(sizeof(char)*m);
- if(pl -> element != NULL)
- {
- pl -> maxsize = m;
- pl -> n = 0;
- return pl;
- }
- else
- free(pl);
- }
- else
- printf("Over flow!/n");
- return NULL;
- }
- void makeFlag(plist ps, int *flag)
- {
- int i = 0, k = -1;
- flag[0] = -1;
- while(i < ps -> n - 1){
- while(k >= 0 && ps -> element[i] != ps -> element[k])
- k = flag[k];
- i++;
- k++;
- flag[i] = k;
- }
- }
- int pMatch(plist ts, plist ps, int *flag)
- {
- int i = 0, j = 0;
- while(i < ps -> n && j < ts -> n)
- if(i == -1 || ps -> element[i] == ts -> element[j])
- {
- i ++;
- j ++;
- }
- else
- {
- i = flag[i];
- }
- if(i >= ps -> n)
- return (j - ps -> n + 1);
- else
- return 0;
- }
- int main(int argc, char ** argv)
- {
- plist ts = createNullList_Seq(15);
- ts -> n = 14;
- plist ps = createNullList_Seq(6);
- ps -> n = 5;
- char b[] = "abcab";
- char a[] = "abcadabcabbaaf";
- strcpy(ps ->element, b);
- strcpy(ts ->element, a);
- int i;
- int flag[5];
- makeFlag(ps, flag);
- int index = 0;
- index = pMatch(ts, ps, flag);
- printf("%d/n", index);
- return 0;
- }