簡體   English   中英

刪除空格后檢查字符串是否為回文

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM