大話數據結構讀後感(二)串

5.2 串的定義算法

5.3 串的比較 strcmp();數組

5.6 樸素的模式匹配算法      //KMP模式匹配算法spa

  int  Index(String S , Sring T , int pos)get

  {next

    int  i=pos;while

    int j=0;字符

    //int next[255];return

    //get_next(T,next);//KMP算法獲得next數組;void

    while(i<S.size()&&j<=T.size())

    {

      if(S[i]==T[j])        //   ||   j==0;

      {

        ++i;

            ++j;

      }

      else

      {

        i=i-j+1; //i退回到上次匹配的首位的下一位;

        j=0;    //子串退回到T的首位;

        //j=next[j];  //j退回合適的位置,i不變;   KMP算法;

      }

    }

    if(j>T.size())

    {

      return i-T.size();

    }

    else

      return 0;

  } 

next數組的推演;

  void  get_next(Sting T,int *next)

  {

    int i,j;

    i=1;

    j=0;

    next[1]=0;

    while(i<T.size())

    {

      if(j==0 || T[i]==T[j])

      {

        ++i;

        ++j;

        next[i]=j;

      }

      else

        j=next[j];            // j回溯;

    }

  }

KMP算法的改進:

void  get_nextval (Sting T,int *next)

  {

    int i,j;

    i=1;

    j=0;

    nextval[1]=0;

    while(i<T.size())

    {

      if(j==0 || T[i]==T[j])

      {

        ++i;

        ++j;

        //next[i]=j;

        if(T[i]!=T[j]) //若當前字符與前綴字符不一樣,則當前的j爲nextval在i位置的值;

        {

          nextval[i]=j;

        }  

        else  

          nextval[i]=nextval[j];//若是與前綴字符相同則將前綴字符的nextval值賦值給nextval在i位置的值;

      }

      else

        j=nextval[j];            // j回溯;

    }

  }

相關文章
相關標籤/搜索