[英]Check if a string is a palindrome after whitespace is deleted
def is_palindrome(input_string):
# We'll create two strings, to compare them
new_string = input_string.strip()
print(new_string)
# Traverse through each letter of the input string
newstringseperated = new_string.split()
n = len(new_string)
if n%2 == 0:
for i in range(n//2 - 1):
if newstringseperated[i] != newstringseperated[n-1-i]:
print("False")
hello = 1
if hello == 1:
print("False")
else:
print("True")
if (n%2) != 0:
for i in range((n-1)//2):
if newstringseperated[i] != newstringseperated[n-1-i]:
hello2 = 1
if hello2 == 1:
print("False")
else:
print("True")
我試圖在“kayak”和“deed”這兩個詞上執行這段代碼。 它顯示了它們兩者的索引錯誤。 這里有什么問題? 有人可以幫我找出錯誤嗎?
首先,要刪除空格,請使用replace()
而不是strip()
,因為它也會處理字符串中間的空格。
其次,更大的問題是split()
方法。 它根據特定的分隔符創建一個子字符串列表,您實際上是在比較單詞而不是字符。 老實說,您甚至不需要這種方法來檢查回文,只需像這樣稍微修改一下代碼就可以正常工作:
def is_palindrome(input_string):
new_string = input_string.replace(" ", "")
n = len(new_string)
for i in range(n // 2):
if new_string[i] != new_string[n - 1 - i]:
print("False")
return False
print("True")
return True
你在這里有很多問題。 正如@John 所說,您想使用n // 2 - 1
而不是n / 2 - 1
以便結果為整數。 如果您使用re.sub()
而不是split()
,您可以去掉輸入字符串中間的空格,去掉制表符和空格。 最大的問題是拆分輸入字符串以創建newstringseperated
並使用它會把你搞砸。 如果您改為直接對new_string
進行操作,您的代碼將起作用。 另一個小細節……您一發現不匹配就可以break
。 這個版本的代碼可以滿足您的期望:
import re
def is_palindrome(input_string):
# We'll create two strings, to compare them
new_string = re.sub(r'\s+', '', input_string)
print(new_string)
# Traverse through each letter of the input string
# newstringseperated = new_string.split()
n = len(new_string)
if n % 2 == 0:
hello = 0
for i in range(n // 2 - 1):
if new_string[i] != new_string[n - 1 - i]:
hello = 1
break
if hello == 1:
print("False")
else:
print("True")
# Add any non-blank letters to the
# end of one string, and to the front
# of the other string.
if (n % 2) != 0:
hello2 = 0
for i in range((n - 1) // 2):
if new_string[i] != new_string[n - 1 - i]:
hello2 = 1
break
if hello2 == 1:
print("False")
else:
print("True")
is_palindrome("kayak")
is_palindrome("deed")
is_palindrome("abcde")
is_palindrome("abcd")
結果:
kayak
True
deed
True
abcde
False
abcd
False
最好不要在代碼中使用這兩種情況(奇數和偶數長度)。 這是一種只有一個版本的內部邏輯的方法:
import re
def is_palindrome(input_string):
new_string = re.sub(r'\s+', '', input_string)
print(new_string)
# Traverse through each letter of the input string
n = len(new_string)
for i in range(n // 2 - 1 + n % 2):
if new_string[i] != new_string[n - 1 - i]:
hello = 1
break
else:
hello = 0
print("False" if hello == 1 else "True")
這會產生相同的結果。
我必須在手機上執行此操作,但如果您正在尋找回文,這應該可行:
txt = "hannah"
txt2 = "kayak"
txt3 = "blaat"
def palin(txt):
first_half = len(txt) // 2
start_second_half = first_half -1 if len(txt)%2==0 else first_half
return txt[:first_half] == txt[-1:start_second_half:-1]
print(palin(txt))
print(palin(txt2))
print(palin(txt3))
只需反轉字符串並進行測試,這樣就不需要循環:
def is_palindrome(txt):
txt = txt.replace(' ', '')
return txt == txt[::-1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.