2017-07-29 7 views
0

Pythonの回文のスワッパ

回文は、文字列に2つの隣接する文字を交換することにより作成することができる場合は、それは例えばのために(回文を返す必要があります入力のために。文字列 "kyaak"、インデックス1と2の文字を入れ替えると、 "カヤック"が形成されます)、そうでなければ文字列-1を返さなければなりません。ここで何が間違っていますか?

def PalindromeSwapper(s): 
    for idx,i in enumerate(s[:]): 
     if (s[idx],s[idx+1] == s[idx+1],s[idx]) and (s[:] == s[::-1]): 
      return s[:] 
     else: 
      return -1 
+0

https://codereview.stackexchange.com/questions/93225/checking-if-any-permutation-of-a-string-can-make-it-palindrome –

+1

「s [idx]、s [idx +1]) 'と'(s [idx + 1]、s [idx]) 'を呼び出し、それらのペアがいつ等しいかを尋ねます。それがあなたがテストしているものです。そして、 '(s [:]'と 's [:: - 1])'に対しても同じことをします。この関数は、 "yyaayy" –

答えて

0

このコードは、今取り組んでいる:

def PalindromeSwapper(s): 
    length = len(s) 
    for idx, i in enumerate(s): 
     if idx == length-1: return -1 # if idx==length-1, then t[idx+1] will give IndexError 
     t = list(s) # make list, so swapping is possible 
     t[idx], t[idx+1] = t[idx+1], t[idx] # swap characters 
     t = ''.join(c for c in t) # rebuild string from list 
     if t == t[::-1]: return t # palindrome condition 

あなたのコード内のいくつかの間違いが実際にありました。最初のコメントは@ Mark_Mがコメントに記載されているようにs[idx],s[idx+1] == s[idx+1],s[idx]でした。 2番目の方法は、-1がforループの最初の繰り返しの直後に返されるためです(つまり、idx0の場合、大きな値のidxの場合もチェックされません)。
こちらのコードがどのようにこれらの間違いを処理するのかをご理解いただければ幸いです。

2次の例が示すように、(2つの文字の本来のスワップが行われた場所に応じて)理にかなって回文を取得する関数にss[::-1]を供給するために有用であることができます。

>>> PalindromeSwapper('kayka') # swaps the first two characters and finds palindrome 
'akyka' 
>>> PalindromeSwapper('kayka'[::-1]) 
'kayak'