1

我正在做一些 python 在线教程,但我被困在一个练习中:回文是一个单词,它的正向和反向拼写相同。例如,这个词

赛车

是回文:第一个和最后一个字母相同(r),第二个和倒数第二个字母相同(a),等等。编写一个函数 isPalindrome(S),它以字符串 S 作为输入,并返回 True如果字符串是回文,否则为 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

一种单线解决方案,但 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

在 Python 中检查单词是否是回文的最佳方法如下:

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

但是,了解 Python 会创建一个新的字符串副本非常重要,因为您在var[::-1] 内部执行 Python 不知道反向是否会产生相同的字符串。因此,它的编码方式是创建它的新副本。所以,当你尝试时,var[::1] is var[::-1]你会得到 FALSE。

于 2020-02-08T13:33:44.277 回答
1

尝试这个

word='malayalam'
print(word==word[::-1])
于 2018-02-24T07:55:24.900 回答
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 回答
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 回答
-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 回答
-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 回答