2016-04-11 29 views
0

なり - https://www.hackerrank.com/challenges/palindrome-indexは、私はこのHackerRank問題の解決策を書いて回文

を、私はこのコードを試してみた:

T = int(raw_input()) 

for t in xrange(T): 
    s = raw_input() 
    index = -1 
    if s != s[::-1]: 
     for i in xrange(len(s)): 
      temp = s[:i:] + s[i+1::] 
      if temp == temp[::-1]: 
       index = i 
       break 
    print index 

をしかし、私はそれを送信すると、 14個のテストケースのうち、約8時間(約5〜7秒)がかかっており、そのうちの1つが10秒以上かかるため、HackerRankは結果を表示しません。 私のコードは効率が悪いようです。速く走れるように私を助けてください。

+0

あなたがのためのアイデアを持っていますかこれらの文字列のサイズ?大きなオブジェクトの場合、 's [:: - 1]'はいくらか遅くなります(コピーがO(n)に生成されます) –

+0

@ AlexO'Neill 100005 chars – Ivo

+0

@Ivoが指摘しているように、 100,000文字。私はそれが最後のいくつかのテストケースがあまりにも多くの時間を費やす理由だと思います。 –

答えて

2

コードを高速化する最も簡単な方法は、文字列が回文文字列でない場合にすべてのインデックスに対してスライスを削除することです。最長の文字列の場合、行頭に続く回文ではなく、temp = s[:i:] + s[i+1::]の200000個以上のスライスが生成されます。

違いを見つけるまで、最初と最後の文字列のチェックを開始できます。一度発見されると、最初または最後の文字が削除されたスライスを生成し、それが回文かどうかを確認することができます。場合は、あなたが最初の文字を削除し、結果はあなたが最後の文字が問題の記述以来、正しい解決策であることを保証することを知って回文ませんでした:

T = int(raw_input()) 

for t in xrange(T): 
    s = raw_input() 
    length = len(s) 
    for i in xrange(length/2): 
     if s[i] != s[length - i - 1]: 
      if s[i + 1:length - i] == s[length - i - 1:i:-1]: 
       print i 
      else: 
       print length - i - 1 
      break 
    else: 
     print -1 
+0

ありがとうございます。 :) 今、私は分かる。 –

2

最も効率的な方法は、両側からチェックすることになり、左と右と不平等に破る:

for i in range(int(input())): 
    s=input() 
    if s==s[::-1]: 
     print(-1) 
    else: 
     for i in range(int(len(s)/2)): 
      if s[i]!=s[len(s)-1-i]: 
       print(i if ((s[:i]+s[i+1:])==(s[:i]+s[i+1:])[::-1]) else len(s)-1-i) 
       break 

どうやら私は、同様にそのサイトのメンバーだ私のコードを実行し、それが0.01秒ですべてのテストケースを渡し、0.02s

関連する問題