Pythonで解く!電話番号からすべての文字の組み合わせを生成する方法
2〜9までの数字を含む文字列が与えられたとき、その番号が表しうるすべての文字の組み合わせを返すことを考えます。以下は、電話のダイヤルボタンと同じように、各数字に割り当てられた文字のマッピングです。なお、「1」はどの文字にも対応しない点に注意してください。
| 1 | 2 a b c | 3 d e f |
| 4 g h i | 5 j k l | 6 m n o |
| 7 p q r s | 8 t u v | 9 w x y z |
| * | 0 | # |
たとえば、入力として「23」が与えられた場合、生成される可能性のある文字列は次のようになります。
["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
解法のアプローチ
この問題は、再帰的なバックトラッキングを用いることで効率的に解けます。手順は以下の通りです。
- 問題を再帰的に解決するための solve メソッドを定義します。
- solve メソッドは、digits(数字列)、characters(マッピング)、result(結果リスト)、current_string(現在構築中の文字列)、current_level(現在処理中の桁位置)を引数として受け取ります。
- current_level が digits の長さと等しくなったら、1つの組み合わせが完成したことになるため、current_string を result に追加して処理を終了します。
- それ以外の場合は、characters[digits[current_level]] に含まれる各文字 i について、solve(digits, characters, result, current_string + i, current_level + 1) を再帰的に呼び出します。
メイン関数の流れ
- digits の長さが0の場合は、空のリストを返します。
- 数字と対応する文字列を保持する辞書(マップ)を定義します。
- 結果を格納する空のリスト result を用意します。
- solve(digits, characters, result, "", 0) を呼び出して探索を開始します。
実装例(Python)
理解を深めるために、実際のコードを見てみましょう。
class Solution(object):
def letterCombinations(self, digits):
if len(digits) == 0:
return []
characters = {2:"abc",3:"def",4:"ghi",5:"jkl",6:"mno",7:"pqrs",8:"tuv",9:"wxyz"}
result = []
self.solve(digits,characters,result)
return result
def solve(self, digits, characters, result, current_string="",current_level = 0):
if current_level == len(digits):
result.append(current_string)
return
for i in characters[int(digits[current_level])]:
self.solve(digits,characters,result,current_string+i,current_level+1)
ob1 = Solution()
print(ob1.letterCombinations("37"))
入力
"37"
出力
["dp","dq","dr","ds","ep","eq","er","es","fp","fq","fr","fs"]
このように、再帰とバックトラッキングを組み合わせることで、数字列に対応するすべての文字の組み合わせを漏れなく生成できます。計算量は入力の長さに対して指数的に増加しますが、電話番号のような短い入力であれば十分に高速に動作します。
-
Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方
階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換
-
Python正規表現で文字列中の繰り返し数字を検出する方法
Pythonの正規表現(reモジュール)を使うと、文字列の中から同じ数字が連続して繰り返される部分を簡単に見つけることができます。ポイントは、キャプチャグループとバックリファレンス、そして量指定子 {n} を組み合わせることです。繰り返し数字を検出するサンプルコード次のコードは、与えられた文字列の中から「同じ数字が4回連続して出現している箇所」を検索する例です。import re result = re.search(r(\d)\1{3}, 54222267890) print(result.group())実行結果このコードを実行すると、以下のようにマッチした部分が出力されます。2222正