【競技プログラミング】「Longest Comman Prefix」with Python | LeetCode #14

Python

こちらは「Longest Comman Prefix」のPythonによる解答例となっております。この問題は、複数の文字列が与えられたときに、それらの先頭に共通する部分列を返す問題です。

問題

文字列の配列 strs が与えられたとき、それらの先頭に共通する最長の部分列を返します。もし共通の部分列が存在しない場合は、空文字列 “” を返します。

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] は小文字の英字のみから構成されます。

解法

この問題は、簡単な文字列操作を用いた1つのアプローチがあります。

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

  1. 最短の文字列を取得します。
  2. 最短の文字列の各文字について、他のすべての文字列に存在するかどうかを確認します。
  3. 存在する場合は、その文字を答えの文字列に追加します。
  4. 存在しない場合は、処理を終了します。

Pythonコード

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

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

def solve(num=0):
    
    solver  = Solution().longestCommonPrefix
    
    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.strs)
        result  = "OK" if ans==data.ans else "NG"
        print(f"[{str(id).zfill(3)}] {result}")

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

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
            1 <= strs.length <= 200
            0 <= strs[i].length <= 200
            strs[i]: Lowercase Alphabets
        :rtype: str
        """
        
        if len(strs)==1: return strs[0]
        
        prefix = ""
        for i in range(len(min(strs))):    
            c = strs[0][i]
            if all(a[i]==c for a in strs): prefix += c
            else: break
        
        return prefix

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

class Input:
    
    def __init__(self, num=0):
        
        if num == 1:
            self.strs = ["flower","flow","flight"]
            self.ans    = "fl"
        
        elif num == 2:
            self.strs = ["dog","racecar","car"]
            self.ans    = ""
        
        else:
            self.input  = 2

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

if __name__ == "__main__":

    solve()

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