web-dev-qa-db-ja.com

python文字列内で繰り返される部分文字列を検索する

Pythonで、特定の単語が特定の長さに達するまで数回繰り返された入力として文字列を指定する関数を探しています。

その場合、出力はそのWordになります。繰り返される単語は、全体として繰り返される必要はなく、まったく繰り返されていない可能性もあります。

例えば:

"pythonpythonp" => "python"

"hellohello" => "hello"

"appleapl" => "Apple"

"spoon" => "spoon"

この種の関数の書き方について誰かが私にヒントを教えてもらえますか?

6
Sieglinde

部分文字列を特定の回数繰り返し、元の文字列と等しいかどうかをテストすることで、これを行うことができます。

変数として保存していない限り、文字列の可能なすべての長さに対してそれを試す必要があります

コードは次のとおりです:

def repeats(string):
    for x in range(1, len(string)):
        substring = string[:x]

        if substring * (len(string)//len(substring))+(substring[:len(string)%len(substring)]) == string:
            print(substring)
            return "break"

    print(string)

repeats("pythonpytho")
6
Tom Fuller

プレフィックス配列を作成することから始めます。

逆にループして、文字列内で繰り返されているものを最初に見つけたときに停止します(つまり、str.count()>1があります。

これで、同じ部分文字列がそれ自体のすぐ隣に存在する場合、探している単語として返すことができますが、提案されたアルゴリズムがapplを返す'appleappl'の例を考慮する必要があります。 。そのため、文字列内に複数回存在する部分文字列を見つけた場合、その結果として、その部分文字列とその次の出現の間にあるものを返します。つまり、'appleappl'の場合は'appl' +'e' = 'Apple'を返します。そのような文字列が見つからない場合は、繰り返しがないため、Word全体を返します。

def repeat(s):
    prefix_array=[]
    for i in range(len(s)):
        prefix_array.append(s[:i])
    #see what it holds to give you a better picture
    print prefix_array

    #stop at 1st element to avoid checking for the ' ' char
    for i in prefix_array[:1:-1]:
        if s.count(i) > 1 :
            #find where the next repetition starts
            offset = s[len(i):].find(i)

            return s[:len(i)+offset]
            break

    return s


print repeat(s)
0
themistoklik