【競技プログラミング】「Valid Palindrome」with Python | LeetCode #125

Python

こちらは「Valid Palindrome」のPythonによる解答例となっております。この問題は、与えられた文字列が回文であるかどうかを判定する問題です。

問題

与えられた文字列 s が回文であるかどうかを判定します。ただし、空白文字、句読点、大文字小文字の違いは無視してください。

  • 1 <= s.length <= 10^5
  • s は英数字のみで構成されます。

解法

この問題は、文字列の前半と後半を比較することで回文であるかどうかを判定することができます。ただし、空白文字、句読点、大文字小文字の違いは無視する必要があるため、文字列を前処理する必要があります。

アルゴリズムの概要を以下に述べます。

  1. 文字列を前処理し、英数字のみを含んだ新しい文字列を作成します。
  2. 文字列の前半と後半を比較し、異なる場合は回文ではありません。
  3. 文字列が回文である場合、True を返します。

Pythonコード

以下のコードが、「Valid Palindrome」を解くためのPythonプログラムとなります。

### Function ##################################################################

def solve(num=0):
    
    solver  = Solution().isPalindrome
    
    if 1 <= num <= Input().input: id_LIST = [num]
    else: id_LIST = [id+1 for id in range(Input().input)]
    
    for id in id_LIST:
        data    = Input(id)
        ans     = solver(data.s)
        result  = "OK" if ans==data.ans else "NG"
        print(f"[{str(id).zfill(3)}] {result}")

### Class #####################################################################

class Solution(object):
    
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        
        STR = [char.lower() for char in s if char.isalnum()]
        return STR == STR[::-1]

#==============================================================================

class Input:
    
    def __init__(self, num=0):
        
        if num == 1:
            self.s = "A man, a plan, a canal: Panama"
            self.ans    = True
        
        elif num == 2:
            self.s = "race a car"
            self.ans    = False

        elif num == 3:
            self.s = " "
            self.ans    = True
        
        else:
            self.input  = 3

### Main ######################################################################

if __name__ == "__main__":

    solve()

###############################################################################