2017-11-03 7 views
0
testcases = int(input()) 
for i in range(testcases): 
    n = int(input()) 
    names = [] 
    for a in range(n): 
     names.append(input()) 
    prefix = '' 
    for b in range(len(names[0])): 
     for c in names: 
      if c.startswith(prefix) == True: 
       common = True 
      else: common = False 
     if common == False: 
       break 
     prefix += names[0][b] 
    print(prefix) 

私は名前のリストが与えられており、すべての名前に適用される共通接頭辞を見つける必要があります。私のプログラムは動作しますが、常にそこにあるはずの文字をもう1つ返します。なぜですか、どうすれば修正できますか?高いスコア! ACMから2017

答えて

0

現在のプレフィックスが入力されたすべての名前と一致する場合は、もう1文字追加します。一致しない場合は、ループを中断しますが、エラーの原因となった文字はまだ末尾のprefixに添付されています。

は、この問題を解決するための様々な方法がありますが、一つの可能​​性はちょうどループの外でこのステートメントを追加することによって、最後の文字を削除することです:

prefix = prefix[:-1] # python slice notation - remove the last element 

はあなたのコードといくつかのスタイルの問題があります。これらは、StackoverflowではなくCodeReviewで最もよく対処されます。私は(ハードコード化されたテストケースを使用して入力文を交換した後)、このようにそれをやっているだろう

x = ["Joseph", "Jose", "Josie", "Joselyn"] 

n = 0 
try: 
    while all(a[n] == x[0][n] for a in x[1:]): 
     n += 1 
except IndexError: 
    pass 
print(x[0][:n]) 

このスクリプト版画「ヨス」。

+0

ループから抜け出すと、ブレークの下にあるコードが実行されますか?私のプレフィックス+ =はブレーク後に来るので、ブレークしてもそれを実行できないと思います。 @paul – jamestheasiangenius

+0

前回のループで 'prefix'の最後に文字を追加しました。あなたは 'prefix'をテストして失敗するまでループから脱出しません。その時点の 'prefix'にはすでに失敗した文字列が含まれています。成功した文字列は、正確に1文字だけ短くなければなりません。 breakステートメントはループを終了するだけです。そのため、次のコードが実行されます。 –

+0

Hmm。プレフィックス[: - 1]を使わずにこれを修正する方法はありますか?私は実際にこれを修正する方法を学びたいだけで、回避策を追加するだけではありません。ありがとう@paul – jamestheasiangenius

関連する問題