KMP模式匹配算法实现与改进

12年前
/*KMP模式匹配算法实现*/  //通过计算返回子串T的next数组  void get_next(String T,int * next)  {   int i,j;   i = 1;   j = 0;   next[1] = 0;   while (i < T[o]) //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  int Index_KMP(String S,String T,int pos)  {   int i = pos;   int j = 1;   int next[255]; //定义一个next数组   get_next(T,next); //对串T作分析,得到next数组   while (i <= S[0] && j<= T[0]) //S[0]和T[0]为主串个子串的长度   {    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;  }
/*KMP模式匹配算法的改进*/  //通过计算返回子串T的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值回溯   }  }
转自:http://blog.csdn.net/hacke2/article/details/7295628