0

理解を深めるために、課題の関数をいじっていました。これは、文字列内のサブ文字列の最後の出現を見つけることを目的としていました。この関数は、サブ文字列の最後の出現の開始位置を返す必要があります。サブ文字列がまったく見つからない場合は、-1を返す必要があります。「標準」の方法は次のとおりです。

def find_last(full, sub):
    start = -1
    while True:
        new = full.find(sub, start + 1)
        if new == -1:
            break
        else:
            start = new
    return start

これがより効率的な方法であるように思われたので、私はそれを逆に検索してもらいたかった。だから私はこれを試しました:

def find_last(full, sub):
    start = -1
    while True:
        new = full.find(sub, start)
        if new == -1 and abs(start) <= len(full): #evals to False when beginning of string is reached
            start -= 1
        else:
            break
    return new

合格する必要のあるいくつかのテストケースが与えられ、私の逆関数は1つを除いてすべて合格しました。

print find_last('aaaa', 'a')
>>>3
print find_last('aaaaa', 'aa')
>>>3
print find_last('aaaa', 'b')
>>>-1
print find_last("111111111", "1")
>>>8
print find_last("222222222", "")
>>>8 #should be 9
print find_last("", "3")
>>>-1
print find_last("", "")
>>>0

findが負のインデックスでこのように動作している理由を誰かが親切に説明できますか?それとも、それは私のコードのいくつかの明白な間違いですか?

4

1 に答える 1

3

空の文字列は任意の位置にあります。で初期化startする-1と、アルゴリズムは最後ではなく最後から2番目の位置から検索を開始します。

最後の位置は文字列の最後の文字のにありますが、文字列の最後の文字を見始めてます。

于 2012-05-01T00:08:59.477 に答える