アルゴリズム(文字列は、その子の構成からなる文字列を複数回繰り返したか否かを判定する)

非空の文字列を考えると、その子の構成からなる文字列が複数回繰り返すかどうかを判断することができます。与えられた文字列が小文字のみではなく、より多くの10000以上の長さが含まれています。

例1:

入力: "ABAB"

出力:真

説明:「AB」により部分は、二回の構成を繰り返しました。
例2:

入力: "ABA"

出力:Falseの
例3:

入力: "abcabcabcabc"

出力:真

説明:サブストリング「ABC」で繰り返し4回となります。(または反復二回構成の「ABCABC」サブストリング。)

 

問題解決のためのアイデア
あなたは、文字列を繰り返した場合Sは、部分文字列を含んで、この手段あなたが何度もあなたの文字列をすることができますし、元の文字列とそれにマッチする「シフトとラインフィード。」
たとえば、次のようにABCABC
変更:cabcabは
2回交換:bcabcaは
3回変更:ABCABC

今元の文字列と文字列マッチングは、繰り返しストリングが存在することを結論付けることができます

1回 - この考えに基づいて、マッチング移動長さまで各移動k個の文字ができます。しかし、繰り返し文字列のような長い文字列のため、効率が非常に低いです。残業中LeetCode実行時間で。

この無用の周りを避けるために、あなたは元の文字列SプラスS自体に等しい新しい文字列strを、作成することができますので、実際にはすべての文字列が移動が含まれています。

このような文字列として:S = ACD、その後、STR = S + S = acdacd

ACD移動かもしれない:DAC、CDA。実際に、彼らはstrの中に含まれています。スライディングウィンドウと同様に

開始ACD(ACD)、モバイルAC(DAC)D、二つ(CDA)CDを移動させます。サイクルの終わり

STRを直接決定することができるように頭と尾の要素を除去した後、それは素子自体を含んでいます。あなたが含まれている場合。これは、反復配列の存在を示します。

FUNC repeatedSubstringPattern(複数)BOOL { 
    Stempに:= S + S 
    STEMP = Stempに[1:lenは(Stempに)-1 ] 
     場合(strings.Index(Stempには、S)> = 0 ){
         戻り 
    } {
         戻り 
    } 
}

 

出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/repeated-substring-pattern:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

おすすめ

転載: www.cnblogs.com/cjjjj/p/12507967.html