EDIT :同様のタスクに関する質問が SO で既に行われていることは承知していますが、この特定のコードの問題を見つけることに興味があります。また、この問題は再帰を使用せずに解決できることも認識しています。
タスクは、文字がアルファベット順に出現する最長の部分文字列を検索 (および出力) するプログラムを作成することです。同じ長さのシーケンスが複数見つかった場合は、最初のシーケンスが出力されます。たとえば、文字列の出力は にabczabcd
なりますabcz
。
私は手動テストに合格したように見える再帰でこの問題を解決しました。しかし、ランダムな文字列を生成する自動テスト セットを実行すると、出力が正しくない場合があることに気付きました。例えば:
の場合s = 'hixwluvyhzzzdgd'
、出力はhix
代わりにluvy
の場合s = 'eseoojlsuai'
、出力はeoo
代わりにjlsu
の場合s = 'drurotsxjehlwfwgygygxz'
、出力はdru
代わりにehlw
しばらく苦労した後、これらの文字列の何が特別で、バグの原因なのかを理解できませんでした。
これは私のコードです:
pos = 0
maxLen = 0
startPos = 0
endPos = 0
def last_pos(pos):
if pos < (len(s) - 1):
if s[pos + 1] >= s[pos]:
pos += 1
if pos == len(s)-1:
return len(s)
else:
return last_pos(pos)
return pos
for i in range(len(s)):
if last_pos(i+1) != None:
diff = last_pos(i) - i
if diff - 1 > maxLen:
maxLen = diff
startPos = i
endPos = startPos + diff
print s[startPos:endPos+1]