三种字符串的模式匹配
2017-02-15 22:29
162 查看
1、朴素的模式匹配算法
/*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。*/ /*T非空,1≤pos≤StrLength(S)。*/ int Index(String S, String T, int pos) { int i = pos; /*i用于主串S中当前位置下标,若pos不为1*/ /* 则从pos位置开始匹配 */ int j = 1; /*j用于子串T中当前位置下标值*/ while (i <= S[0] && j <= T[0] ) /*若i小于S长度且j小于T长度时循环*/ { if (S[i] == T[j]) /*两字母相等则继续*/ { ++i; ++j; } else /*指针后退重新开始匹配*/ { i=i-j+2; /*i退回到上次匹配首位的下一位*/ j=1; /*j退回到子串T的首位*/ } } if (j > T[0]) return i-T[0]; else return 0; }
2、KMP模式匹配算法
/*通过计算返回子串T的next数组*/ void get_next(String T, int *next) { int i, j; i=1; j=0; next[1]=0; while(i < T[0]) /* 此处T[0]表示串T的长度 */ { if (j == 0 || T[i] == T[j]) /*T[i]表示后缀的单个字符*/ /*T[j]表示前缀的单个字符*/ { ++i; ++j; next[i] = j; } else j = next[j]; /*若字符不相同,则j值回溯*/ } } /*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。*/ /*T非空,1≤pos≤StrLength(S)。*/ int Index(String S, String T, int pos) { int i = pos; /*i用于主串S中当前位置下标,若pos不为1*/ /* 则从pos位置开始匹配 */ int j = 1; /*j用于子串T中当前位置下标值*/ int next[255]; /*定义一个next数组*/ get_next(T, next); /*对串T作分析,得到next数组*/ while (i <= S[0] && j <= T[0] ) /*若i小于S长度且j小于T长度时循环*/ { if (j == 0 || S[i] == T[j]) /*两字母相等则继续*/ { ++i; ++j; } else /*指针后退重新开始匹配*/ { j = next[j]; /*j退回合适的位置,i值不变*/ } } if (j > T[0]) return i-T[0]; else return 0; }
3、改进的KMP模式匹配算法
/* 求模式串T的next函数修正值并存入数组nextval */ void get_nextval(String T, int *nextval) { int i, j; i=1; j=0; nextval[1]=0; while(i < T[0]) /* 此处T[0]表示串T的长度 */ { if (j == 0 || T[i] == T[j]) /*T[i]表示后缀的单个字符*/ /*T[j]表示前缀的单个字符*/ { ++i; ++j; if (T[i] != T[j]) /*若当前字符与前缀字符不同*/ nextval[i] = j; /*则当前的j为nextval在i位置的值*/ else nextval[i] = nextval[j]; /*若与前缀字符相同,则将*/ /*前缀字符的nextval值赋给nextval在i位置的值*/ } else j = nextval[j]; /*若字符不相同,则j值回溯*/ } }
实际匹配算法,只需将“get_next(T, next) ;”改为“get_nextval(T, next) ;”即可。
此处算法引用《大话数据结构》一书,仅供自己学习使用。
相关文章推荐
- KMP字符串模式匹配详解
- 用IPTables实现字符串模式匹配
- 字符串普通模式匹配和KMP模式匹配[面相对象喽]
- KMP字符串模式匹配详解
- 用IPTables实现字符串模式匹配
- 字符串模式匹配(Pattern Matching)之一:回溯法
- 字符串的模式匹配算法 KMP
- KMP字符串模式匹配详解
- 字符串多模式精确匹配(脏字/敏感词汇/关键字过滤算法)——TTMP算法 之实战F模式
- 字符串模式匹配算法实现1
- 字符串模式匹配
- KMP 字符串模式匹配详解
- c/c++程序之_KMP字符串模式匹配详解
- KMP字符串模式匹配详解
- 字符串模式匹配
- KMP字符串模式匹配详解
- 用IPTables实现字符串模式匹配
- 字符串模式匹配
- KMP字符串模式匹配详解
- 字符串模式匹配算法实现1