2017-10-30 24 views
1

私は一般的にコーディングするのが初めてで、edXプラットフォームで勉強しています。最初の割り当ての1つは、指定された文字列に最長のアルファベットの部分文字列を出力するコードを書くことです。Pythonで与えられた文字列の最長アルファベット部分文字列を出力する方法は?

私はインターネット上のいたる所を探してみましたが、私が見つけることができるのは固定の答えであり、なぜ私のコードは機能しません。それは私の頭の中で理にかなっているので、私はいくつかの理由を理解するために助けたい。

CODE:

s = 'abcdszabc' 
start = 0 
end = 0 
a = '' 
b = '' 

while len(b) < len(s[start:]): 
    while s[end] <= s[end+1]: 
     end += 1 
    a = s[start:end+1] 
    if a > b: 
     b = a 
    print(b) 
    start += 1 
    end = start 

私はそれを主張し、エラーを取得し実行すると:

while s[end] <= s[end+1]: 
    IndexError: string index out of range 

最初しばらくは行く前に、B列の大きさを評価すべきであるので、それは意味がありません。 2番目の時間に。私のケースでは、最初の試行ではbに 'abcdsz'が割り当てられ、6文字未満のとき(最初の試行ではポイントがないため)、プログラムは最初にループを停止する必要があります。

誰も私にストレートなソリューションを与えないで私を啓発してもらえますか?私はスポイラーなしで私自身でそれを解決するために最善を尽くしています!

+1

エラーの時点で 's'と' end'の値はどうですか? – Prune

答えて

1

...あなたのコードに基本的なトレースを適用する

while len(b) < len(s[start:]): 
    print ("WHILE 1", s, end) 
    while s[end] <= s[end+1]: 
     end += 1 
     print ("WHILE 2", s, end) 
    a = s[start:end+1] 
    if a > b: 
     b = a 
    print("RESULT", b) 
    start += 1 
    end = start 

出力:あり

WHILE 1 abcdszabc 0 
WHILE 2 abcdszabc 1 
WHILE 2 abcdszabc 2 
WHILE 2 abcdszabc 3 
WHILE 2 abcdszabc 4 
WHILE 2 abcdszabc 5 
RESULT abcdsz 
WHILE 1 abcdszabc 1 
WHILE 2 abcdszabc 2 
WHILE 2 abcdszabc 3 
WHILE 2 abcdszabc 4 
WHILE 2 abcdszabc 5 
RESULT bcdsz 
WHILE 1 abcdszabc 2 
WHILE 2 abcdszabc 3 
WHILE 2 abcdszabc 4 
WHILE 2 abcdszabc 5 
RESULT cdsz 
WHILE 1 abcdszabc 3 
WHILE 2 abcdszabc 4 
WHILE 2 abcdszabc 5 
RESULT dsz 
WHILE 1 abcdszabc 4 
WHILE 2 abcdszabc 5 
RESULT sz 
WHILE 1 abcdszabc 5 
RESULT z 
WHILE 1 abcdszabc 6 
WHILE 2 abcdszabc 7 
WHILE 2 abcdszabc 8 
Traceback (most recent call last): 
    File "so.py", line 9, in <module> 
    while s[end] <= s[end+1]: 
IndexError: string index out of range 

それは次のとおりです。endは8であるので、end+1は9インデックスがためだけに0-8で実行され、あなたの9文字の文字列。チェックしている部分文字列がアルファベット順である場合、検索を右端から実行しないように制御することはできません。

+0

ああ、私は今それを参照してください。あなたの助けをありがとう! – Assis

関連する問題