Leetcode Valid Palindrome проходит первый тестовый пример, но не проходит второй при отправке - PullRequest
1 голос
/ 03 августа 2020

Я решаю допустимую проблему палиндрома в leetcode, ниже приводится описание проблемы:

Учитывая строку, определите, является ли она палиндромом, учитывая только буквенно-цифровые символы c и игнорируя регистры.

Примечание. Для решения этой проблемы мы определяем пустую строку как допустимый палиндром.

Пример 1:

Ввод:

A man, a plan, a canal: Panama

Выход:

true

Пример 2:

Ввод:

race a car

Выход :

false

Вот мой код, мой код смог передать первый пример A man, a plan, a canal: Panama, но не прошел второй race a car. Понятия не имею, почему.

class Solution:
    def isPalindrome(self, s: str) -> bool:
        mystring = s.lower()
        mystring2 = ""
        for i in mystring:
            if i.isalnum():
                mystring2 += i
        return mystring2
    
        for i in range(0, int(len(mystring2)/2)):  
            if mystring2[i] != mystring2[len(mystring2)-i-1]: 
                return False
        return True

Ответы [ 4 ]

2 голосов
/ 03 августа 2020

Даже если это не рекомендуется, мы также можем решить эту проблему с помощью регулярного выражения.

Это пройдет:

class Solution:
    def isPalindrome(self, s):
        s = ''.join(re.findall(r'(?is)[a-z0-9]+', s)).lower()
        return s == s[::-1]

Java

class Solution {
    public boolean isPalindrome(String s) {
        String original = s.replaceAll("(?i)[^a-z0-9]", "").toLowerCase();
        String reversed = new StringBuffer(original).reverse().toString();
        return original.equals(reversed);
    }
}

JavaScript

var isPalindrome = function(s) {
    var original = s.replace(/[^a-z0-9]/isg, '');
    var reversed = original.split('').reverse().join('');
    
    return original.toLowerCase() == reversed.toLowerCase();
};

Ссылки

1 голос
/ 03 августа 2020

Вам не нужно возвращать mystring2 после окончания вашего первого oop. Можно сразу начать со второго l oop. Ваш лог c кажется правильным. Простое внесение этой модификации будет работать.

Правильный код -

class Solution:
    def isPalindrome(self, s: str) -> bool:
        mystring = s.lower()
        mystring2 = ""
        for i in mystring:
            if i.isalnum():
                mystring2 += i
    
        for i in range(0, int(len(mystring2)/2)):  
            if mystring2[i] != mystring2[len(mystring2)-i-1]: 
                return False
        return True

В вашем случае это не удается, потому что вы просто возвращаетесь из функции на полпути кода. Последняя часть l oop кода никогда не выполнялась в вашем случае.

Кроме того, в python последнюю часть l oop можно записать гораздо проще -

Немного упрощенный код -

class Solution:
    def isPalindrome(self, s: str) -> bool:
        mystring = s.lower()
        mystring2 = ""
        for i in mystring:
            if i.isalnum():
                mystring2 += i

        return mystring2 == mystring2[::-1]

Точно так же вы можете уменьшить первую часть вашего кода как -

Более упрощенный код -

class Solution:
    def isPalindrome(self, s: str) -> bool:
        mystring2 = ''.join([character.lower() for character in s if chracter.isalnum()])

        return mystring2 == mystring2[::-1]
1 голос
/ 03 августа 2020

Наконец, вы должны вернуть только true или false, а не строку.

class Solution:
    def isPalindrome(self, s: str) -> bool:
        mystring = s.lower()
        mystring2 = ""
        for i in mystring:
            if i.isalnum():
                mystring2 += i

        return (mystring2 == mystring2[::-1])
1 голос
/ 03 августа 2020

Более простой способ сделать это - перевернуть строку и сравнить более pythoni c способом

a = "A man, a plan, a canal: Panama"
newA= [i.lower() for i in a if i.isalnum()]
print(newA == newA[::-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...