[LeetCode] 125 Valid Palindrome


質問する


指定した文字列がパリンdromであるかどうかを確認します.大文字と小文字を区別せず、アルファベットと数字のみ
パリンドロム:前後の同じ単語や文、ひっくり返しても同じ単語や文をパリンドロムと言います。

例1

  • 入力
  • "A man, a plan, a canal: Panama"
  • 出力
  • true

    例2

  • 入力
  • "race a car"
  • 出力
  • false

    私の答え


    この問題は大文字と小文字を区別せず、アルファベットと数字だけを対象にしている.
    したがって、最初に与えられた文字列では、数値と英語の文字が新しいリストに登録されます.英語の大文字と小文字を区別せず、小文字に変更します.
    次に、元の文字列とその文字列を比較して、パリンドロンかどうかを確認します.ファリン症候群ならTrue、またはFalseに戻ります.
    class Solution:
        def isPalindrome(self, s: str) -> bool:
            # 나의 풀이
            answer = False
            s = list(s)
            only_char = []
            
            # 숫자와 문자만 뽑아서 새로운 리스트에 저장
            for i in s:
                if i.isdigit():
                    only_char.append(i)
                if i.isalpha():
                    only_char.append(i.lower())
            
            # origin = 원형
            # reverse_origin = 원형을 뒤집은 것(슬라이싱 사용)
            origin = only_char
            reverse_origin = only_char[::-1]
    
            if origin == reverse_origin:
                answer = True
    
            return answer
    このようにして問題を解いて、また3種類の問題を解く方法が増えて、分かち合いたいです.

    プール1-リストに変換

    class Solution:
        def isPalindrome(self, s: str) -> bool:
            # 풀이1 리스트로 변환
            s = list(s)
            only_char = []
            for i in s:
                # 알파벳과 숫자일때
                if i.isalnum():
                    only_char.append(i.lower())
                    
    	# 문자열 앞과 끝을 동시에 pop 하면서 비교한다
            while len(only_char) > 1:
                if only_char.pop(0) != only_char.pop():
                    return False
    
            return True

    プール2-データ型を使用したデータの最適化

    class Solution:
        def isPalindrome(self, s: str) -> bool:
            # 풀이2 데크 자료형 이용 -> 최적화
            # 자료형 데크로 선언
            strs = collections.deque()
    
            for char in s:
                if char.isalnum():
                    strs.append(char.lower())
    
            # 데크 자료형의 popleft 함수를 이용한다
            while len(strs) > 1:
                if strs.popleft() != strs.pop():
                    return False
    
            return True
    解1はリスト型,解2はビッグデータ型を用いた.Dark資料型の解答2を使う速度が解答1より速いのは、なぜですか?
    その理由は,while文で資料の前後を比較する際に用いられるpop(0)popleft()の違いである.リストのpop()はO(n)O(n)O(n)であり、デックのpopleft()はO(1)O(1)O(1)O(1)O(1)である.
    データ・ウェアハウスを正しく使用すると、コードのパフォーマンスがさらに向上します.

    プール3-スライドの使用

    class Solution:
        def isPalindrome(self, s: str) -> bool:
        	# 풀이3 슬라이싱 사용
            s = s.lower()
            # 정규식으로 불필요한 문자 필터링
            s = re.sub('[^a-z0-9]', '', s)
            return s == s[::-1]
    このプールは、不要な文字を通常のフィルタリングした後、Pythonの文字列を使用してスライドします.
    一人で問題を解いたり、他の解答を見たりして、Dek、Sleing、正規式などを勉強し始めます.
    以前は一人で問題を解決して、他の解答を見たり、他の方法で解いたりした経験がありません.いくつかのなぞなぞを見て、私はよく分からないPythonの文法と概念を知った.
    出典:Pythonアルゴリズムインタビュー