Pythonで2つの括弧列の連結がバランスしているかどうかを判定する方法
問題の概要
「(」と「)」のみで構成された2つの括弧列 s と t が与えられたとき、それらを連結した文字列(s | t または t | s)がバランスの取れた括弧列になっているかどうかを判定します。
例えば、s = "()()))"、t = "()(()(" の場合、t | s の順序で連結すると "()(()(()()))" となり、これは正しく対応の取れた括弧列であるため、出力は True になります。
解決のアプローチ
この問題は、スタック(stack)を使った標準的な括弧チェックのアルゴリズムで解くことができます。手順は以下の通りです。
- is_balanced_parenthesis() 関数を定義します。この関数は文字列を引数として受け取ります。
- stack を空のリストとして初期化します。
- 文字列の先頭から末尾まで各文字を順に走査します。
- 現在の文字が「(」の場合、スタックにプッシュします。
- それ以外の場合(「)」の場合):
- スタックが空であれば False を返します(対応する開き括弧が存在しないため)。
- そうでなければ、スタックからポップします。
- 走査終了後、スタックが空でなければ False を返します。
- スタックが空であれば True を返します。
メインの処理では以下のように判定を行います。
- is_balanced_parenthesis(s + t) が True であれば、True を返します。
- そうでなければ、is_balanced_parenthesis(t + s) の結果を返します。
実装例
以下のコードで実際の動作を確認してみましょう。
def is_balanced_parenthesis(string):
stack = []
for i in range(len(string)):
if string[i] == '(':
stack.append(string[i])
else:
if len(stack) == 0:
return False
else:
stack.pop()
if len(stack) > 0:
return False
return True
def solve(s, t):
if is_balanced_parenthesis(s + t):
return True
return is_balanced_parenthesis(t + s)
s = "()()))"
t = "()(()("
print(solve(s, t))
入力
"()()))", "()(()("
出力
True
まとめ
このように、2つの連結順序(s + t と t + s)のどちらか一方でもバランスが取れていれば True を返すことで、問題を解決できます。スタックを用いることで、各文字列のチェックは O(n) の計算量で効率的に処理でき、ネストの深い括弧列にも正確に対応できます。
-
Pythonで数値がアキレス数かどうかを判定する方法
ある整数 n が与えられたとき、その数がアキレス数(Achilles number)であるかどうかを判定しましょう。アキレス数とは、「べき乗数(powerful number)」であるにもかかわらず「完全累乗数」ではない数のことです。べき乗数とは、すべての素因数 p に対して p² もその数を割り切るような数 N を指します。一方、完全累乗数とは、mk(k ≥ 2)の形で表される数(例:平方数、立方数など)です。なお、アキレス数という名前はギリシャ神話の英雄アキレスにちなんだもので、「強力でありながら完全ではない」という「アキレスのかかと」の故事に由来しています。アキレス数の例としては、72、
-
Pythonでリストがソート済みかどうかを確認する2つの方法
Pythonにおいて、リストは最も広く使われているデータコレクションの一つです。開発の現場では、与えられたリストがすでに昇順にソートされているかどうかを確認したい場面によく出会います。この記事では、その判定を行うための代表的なアプローチを2つ、サンプルコード付きで紹介します。 方法1:sort()メソッドを使う まず元のリストのコピーを作成し、そのコピーに対してsort()メソッドを適用します。その後、ソート済みのコピーと元のリストを比較し、両者が完全に一致していれば「元のリストはすでにソートされている」と判断できます。 サンプルコード listA = [11,23,42,51,67] # 与