686.重複重複文字列マッチング(Python)

1114 ワード

タイトル
難易度:★☆☆☆タイプ:文字列
2つの文字列AおよびBが与えられ、重複する重複する文字列Aの最小回数が、文字列Bが重複する文字列Aのサブ列となり、存在しない場合は−1が返される.
例えば、A=「abcd」、B=「cdabcdab」である.
答えは3で、Aが3回繰り返して「abcdabcdabcd」になったため、Bはそのサブ列である.Aは2回繰り返して「abcdabcd」となり、Bはそのサブ列ではない.
に注意
AとB文字列の長さは1と10000区間の範囲内である.
に答える
A_repeatはAがr回コピーした文字列を表し,1から徐々にrを大きくし,いつBがA_にできるかを調べる.repeat中.
パス履歴のポイントは、作成された文字列の最大長さが2*len(A)+len(B)を超えてはならないことに注意してください.どうしてこの数字を選んだのですか.
次のことを考慮します.
  • 文字列Aが文字列Bより長い場合:(1)文字列Aはもともと文字列Bを含んでいるが、このときAは一度コピーするだけで見つかり、最大長はlen(A);(2)文字列Aは、文字Bを含むものを一度コピーする.この場合、Aの繰り返し回数は2であり、遍歴制御範囲はlen(A)2である.(3)文字列Aを1回コピーして文字Bを含まないと、何回コピーしても文字Bを含まないので、制御長はlen(A)2でよい.
  • 文字列Aが文字列Bより短い場合、文字列Aを文字列Bよりちょうど大きい長さにコピーし、len(B)より小さくない長さに制御するとループから飛び出します.
  • 以上の場合は最大値をとり、和を求めればよい:len(A)*2+len(B).
  • class Solution:
        def repeatedStringMatch(self, A: str, B: str) -> int:
    
            A_repeat, r = A, 1
            while len(A_repeat) < 2 * len(A) + len(B):
                if B in A_repeat:
                    return r
                A_repeat, r = A_repeat + A, r + 1
    
            return -1
    

    質問やアドバイスがあれば、コメントエリアへようこそ~