1

私はいくつかのPythonオンラインチュートリアルを行っていますが、演習で行き詰まりました。回文は、逆方向と順方向で同じスペルの単語です。たとえば、単語

レースカー

は回文です。最初と最後の文字が同じ(r)、最後から2番目と2番目の文字が同じ(a)などです。文字列Sを入力として受け取り、Trueを返す関数isPalindrome(S)を記述します。文字列が回文の場合はFalse、それ以外の場合はFalse。これらは私が書いたコードです:

  def isPalindrome(S):
      if S[0] == S[-1]
        return print("True")
      elif S[0] == S[-1] and S[1] == S[-2] :
        return print("True")
      else:
        return print("False")

ただし、単語がたとえば,, sarcas ,,である場合、出力は正しくありません。したがって、どの単語でも機能するようにコードを修正する必要があります。

4

9 に答える 9

9

1行のソリューションですが、O(n)とメモリが高価です:

def isPalindrome(word) : return word == word[::-1]

同じ量のメモリを使用するAO(n / 2)ソリューションは次のとおりです。

def palindrome(word):
   for i in range(len(word)//2):
         if word[i] != word[-1-i]:
                 return False
   return True

これは@LennartRegebroが言及したトリックです

于 2012-08-01T12:22:28.400 に答える
1
def is_palindrome(text):
    text = text.replace(' ', '')
    text = text.casefold()
    if list(text) == list(reversed(text)):
        return True
    else:
        return False
于 2014-11-25T10:28:02.477 に答える
1

これを試して

word='malayalam'
print(word==word[::-1])
于 2018-02-24T07:55:24.900 に答える
1

Pythonで単語をチェックする最良の方法は回文であるかどうかは、次のとおりです。

var[::] == var[::-1]

ただし、Pythonを内部的に実行すると、Pythonが文字列の新しいコピーを作成することを理解することが非常に重要ですvar[::-1] 。これにより、逆の結果が同じ文字列になるかどうかがわかりません。したがって、新しいコピーを作成する方法でコーディングされています。したがって、試してみるvar[::1] is var[::-1]とFALSEになります。

于 2020-02-08T13:33:44.277 に答える
0

これが私の解決策です。

S = input("Input a word: ")

def isPalindrome(S):
    for i in range(0, len(S)):
        if S[0 + i] == S[len(S) - 1]:
            return "True"
    else:
        return "False"
print(isPalindrome(S))
于 2016-09-24T16:02:20.983 に答える
0

これが私の解決策です:

def isPalindrome(S):
    l = len(S)-1
    for i in range(0,l):
        if S[i]!=S[l-i]:
            return False
    return True
于 2016-11-05T19:55:23.133 に答える
0

再帰を使用してそれを行う別の方法は次のとおりです。

def isPalindrome(word):
  if len(word) <= 1: return True
  return (word[0] == word[-1]) and isPalindrome(word[1:-1])
于 2017-03-16T10:25:38.363 に答える
-1

これが私の解決策ですS=input( "単語を入力してください:")

def isPalindrome(S):
    for i in range(0, len(S)):
        if S[0 + i] == S[len(S) - 1]:
            return "True"
        else:
            return "False"
print(isPalindrome(S))
于 2018-10-31T16:55:58.473 に答える
-1

これは殴打されて死にますが、PythonがCで実装されているかどうか、私にはいくつかのアイデアがあります。

  1. コードは文字列の終わりまで繰り返され、コードの速度とメモリ効率の要因word[::-1]を割り引くコピーを作成しますword == word[::-1]
  2. 文字はすでにテストされているため、単語の真ん中への反復は完全な単語を比較するよりも優れています-奇数の単語の場合、真ん中の文字はテストされません
  3. 足し算と引き算は慎重に使用する必要があります
  4. 再帰はクール(そして楽しい)ですが、多くのスタックを使用します(tail recursion...で最適化されていない限り、基になるコードでforループになる可能性がありますが、コードの最適化を課すのに十分な柔軟性がない可能性があります)。
  5. ビットシフトは、従来、除算よりも高速です

コードは次のとおりです。

def isPalindrome(S):
    last = len(S)
    middle = last >> 1
    for i in range(middle):
        last -= 1
        if(S[i] != S[last]):
            return False
    return(True)


print("\n".join([str((word, isPalindrome(word))) for word in ["abcdcba", "abcdBba", "abccba", "abcBba", "a", ""]]))

これにより、次のようになります。

('abcdcba', True)
('abcdBba', False)
('abccba', True)
('abcBba', False)
('a', True)
('', True)
于 2020-08-17T21:48:18.173 に答える