文字列の一般的な処理方法

1569 ワード

           ,        。      kmp  ,       ,              ,        for  ,    ,              ,                 ,        。
                   ?     kmp   ,                next                  ,       。next     ,                        。               。

http://kb.cnblogs.com/page/176818/次はコード実装
//  next  ,      
void getnext(char *str,int len,int next[]){
    int index=1,n =0 ;//n count the next[]
    next[0] = 0;
    for (index = 1;index0 && str[index] != str[n])
            n = next[n-1];
        if(str[index] == str[n])
            n++;
        next[index] = n;
    }
}
bool kmp(char *src, char *str,int lena,int lenb)
{
    int next[len];
    int j=0;
    getnext(str,lena,next);
    for(int i=0;i0 && src[i] != str[j])
            j = next[j-1];
        if (str[j] == src[i])
            j++;
        if (j == lena){
            cout<
  • よく使われるテクニックは文字列接合
  • です.
  • 辞書順に文字列配列を出力し、[abc,ab,de,mn]
  • bool cmp(string str1,string str2)
    {
        return str1+str2>str1+str2
    }
    

    1つの文字列と別の文字列を比較するのではなく、2つのリンクを比較します.
  • str 1がstr 2の回転後の文字列であるかどうかを確認します.たとえば、abcdefとdefabcの
  • などです.
    bool check(string str1,string str2){
        string str3 = str1+str1;
        return kmp(str2,str3);//  kmp    
    }
    
  • それ以外にも文字列の回転があり、例えば「i am a boy」が「boy a am i」
  • に変換される.
  • 文字列全体「yob a ma i」
  • を回転
  • 単語ごとに「boy a am i」
  • を回転する
    他の文字列テクニックについては、続きます~~