1

何千もの数字を含む文字列があります。文字列を調べて、番号順に並べられた最長の文字セットを見つける必要があります。例えば:

string = '1223123341223455'

その文字列の中で最も長い文字列は 1223455 で、長さは 7 文字です。現時点で私が持っているものの例を次に示します。

r=r2=''
a=b=0
 while a < len(string)+1:
    if string[a] <= string[b]:
        r += string[a]
    else:
        if len(r) < len(r2):
            r = r2
    a += 1
    b += 1

これにより、文字列インデックスが行の範囲外であることがわかります。

if string[a] <= string[b]

これが私の論理です。最初の数値が 2 番目の数値以下かどうかを確認します。そうである場合、それらの 2 つの数値は番号順に並んでいます。その最初の数値を空の文字列に追加します。最初の数値が 2 番目の数値よりも大きくなるまで、これを続けます。この時点に達したら、取得したものを文字列として保存し、中断したところから続行します。ただし、今回は、累積した数値を別の文字列に連結します。2 つの数字列ができたら、2 つを比較して、大きい方を取得します。文字列の処理が完了するまでこれを続けます。これが理にかなっているといいのですが、説明するのは難しいです。

4

4 に答える 4

2

文字列のインデックスは 0 です。したがって、アクセスしようとすると、その文字列の最高のインデックスが でsome_str[len(some_str)]あるため、 が返されます。条件を次のように変更します。また、Pythonモジュール名を覆い隠す可能性があるため、変数として使用しないでください。IndexErrorlen(some_str) - 1whilewhile a < len(myString):stringstring

于 2012-07-13T20:39:44.707 に答える
1

最初に、境界ケースを含め、テストする項目と期待される結果がいくつかあることを確認します。

strings = {
    '1223123341223455': '1223455',  # at the end
    '1': '1',                       # just one
    '12321': '123',                 # at the start
    '212321': '123',                # in the middle
    '': '',                         # empty
    '123234': '123',                # two of same length, take the first
    '12231233412234552': '1223455', # at the end -1 testing the try 

}

次に、これまでに見つかった実際の文字を一時的な文字列に追加せずに、最長の文字列を検索します。それは非効率的です。最長の文字列の開始インデックスとその長さだけを知る必要があります。

def longest(s):
    max_start = 0
    this_start = 0
    max_length_minus_one = 0
    for x in range(len(s)-1):
        if s[x] > s[x+1]:
            length_found = x - this_start
            if length_found > max_length_minus_one:
                max_length_minus_one = length_found
                max_start = this_start
            this_start = x + 1
    try:
        # test the final string position
        length_found = x + 1 - this_start
        if length_found > max_length_minus_one:
            max_length_minus_one = length_found
            max_start = this_start
    except UnboundLocalError:
        pass # empty string throws this exception
    return s[max_start:max_start+max_length_minus_one+1]

テスト ケースでこれを実行し、出力を確認します。

for s, check in strings.iteritems():
    res = longest(s)
    print repr(s), repr(res), 'OK' if res == check else '<<<<< ERROR'
于 2012-07-14T07:17:03.050 に答える
1

問題は、インクリメントaの回数が多すぎることです。したがって、a が文字列 ( ) の長さと等しい場合、プログラムは中断しますa = 16。3行目をに変更するwhile a < len(string):と修正されます。

また、変数で何をしているのかよくわかりません。使用されない r1 を宣言し、r2 を宣言せずに使用します。問題はあなたの方法よりも簡単に解決できます - 次のコードはあなたが望むことをしているようです:

>>> r=longest=''
>>> for a in range(1:len(string)):
        if (string[a-1] <= string[a]) or len(r)==0:
            r += string[a]
        else:
        r = string[a]       // We need to reset r if the string is not in numerical order
        if len(r) > len(longest):
            longest = r
        a += 1
>>> longest
'1223455'
于 2012-07-13T20:41:54.967 に答える
0
string = '1223123341223455'

longest = ''
r = ''

for i in range(len(string)):
    j = i+1
    r += string[i]

    if j > len(string)-1 or string[i] > string[j]:
        if len(r) > len(longest):
            longest = r
            r = ''


print longest # 1223455
于 2012-07-13T20:45:32.147 に答える