Reginald
Reginald

Reputation: 439

Python 3.2 palindrome

I'm doing some python online tutorials, and I got stuck at an exercise:A palindrome is a word which is spelled the same forwards as backwards. For example, the word

racecar

is a palindrome: the first and last letters are the same (r), the second and second-last letters are the same (a), etc. Write a function isPalindrome(S) which takes a string S as input, and returns True if the string is a palindrome, and False otherwise. These is the code I wrote :

  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")

But, if the word is for example ,,sarcas,, , the output is incorect. So I need a fix to my code so it works for any word.

Upvotes: 1

Views: 25784

Answers (9)

codeaperature
codeaperature

Reputation: 1118

This is beaten to death, but I have some ideas if Python is implemented in C. If ...

  1. The code word[::-1] iterates to string end to make a copy which discounts the word == word[::-1] code speed and memory efficiency factors
  2. Iteration to the word middle is better then comparing a full word as characters were already tested - for odd words the middle letter is not to be tested
  3. Additions and subtractions need to be used sparingly
  4. Recursion is cool (and fun), but uses a lot of stack (unless optimized with tail recursion ... which likely becomes a for loop in the underlying code but less likely able to be flexible enough to impose code optimizations).
  5. Bit shifts are traditionally faster than divides

The following is the code:

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", ""]]))

which yields:

('abcdcba', True)
('abcdBba', False)
('abccba', True)
('abcBba', False)
('a', True)
('', True)

Upvotes: -1

MPSC
MPSC

Reputation: 135

The best way to check a word is palindrome or not in Python is as below:

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

But, it is very important to understand that Python creates a new copy of string when you do var[::-1] Python internally don't know if the reverse will result in same string or not. So, it's coded in a way where it creates a new copy of it. So, when you try var[::1] is var[::-1] you will get FALSE.

Upvotes: 1

Mian Shafiq
Mian Shafiq

Reputation: 11

this is my solution 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))

Upvotes: -1

André Oriani
André Oriani

Reputation: 3613

A one line solution but O(n) and memory expensive is :

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

A O(n/2) solution that uses the same amount of memory is:

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

This is the trick @LennartRegebro mentioned

Upvotes: 9

user631662
user631662

Reputation: 73

Try this

word='malayalam'
print(word==word[::-1])

Upvotes: 1

Vlad Bezden
Vlad Bezden

Reputation: 89745

Another way of doing it using recursion is:

def isPalindrome(word):
  if len(word) <= 1: return True
  return (word[0] == word[-1]) and isPalindrome(word[1:-1])

Upvotes: 0

Daniel Szymulański
Daniel Szymulański

Reputation: 1

Here's my solution:

def isPalindrome(S):
    l = len(S)-1
    for i in range(0,l):
        if S[i]!=S[l-i]:
            return False
    return True

Upvotes: 0

Pifko6
Pifko6

Reputation: 17

Here is my solution.

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))

Upvotes: 0

Jean
Jean

Reputation: 11

def is_palindrome(text):
    text = text.replace(' ', '')
    text = text.casefold()
    if list(text) == list(reversed(text)):
        return True
    else:
        return False

Upvotes: 1

Related Questions