Pythonで最長のバランス括弧部分列の長さを求めるプログラム
問題概要
文字列 s が与えられます。この文字列には括弧「(」と「)」が含まれており、その中からバランスの取れた(対応関係が成立している)括弧の部分列として最も長いものを見つけ、その長さを返すことが目標です。
たとえば、入力が s = "())(()(" の場合、出力は 4 になります。「(」と「)」を選び抜いて "()()" というバランスの取れた部分列を作れるためです。
解法のアプローチ
この問題は、文字列を後ろから走査することで線形時間で解けます。閉じ括弧を先に確保しておき、開き括弧が出てきたときに対を成立させるという発想です。手順は以下の通りです。
- 結果を格納する変数
resを 0 で初期化します。 - まだ対応する相手が見つかっていない閉じ括弧「)」の数を数える変数
closeを 0 で初期化します。 - 文字列の末尾(インデックス n-1)から先頭に向かって 1 文字ずつ処理します。
- 現在の文字が「)」の場合:
closeを 1 増やします。 - 現在の文字が「(」で、かつ
close > 0の場合:ペアが成立するのでcloseを 1 減らし、resに 2 を加算します。 - ループが完了したら、
resを返します。
実装例(Python)
以下に実際の実装を示します。理解を深めるために参照してください。
class Solution:
def solve(self, s):
res = 0
n = len(s)
close = 0
for i in range(n - 1, -1, -1):
if s[i] == ")":
close += 1
else:
if close > 0:
close -= 1
res += 2
return res
ob = Solution()
s = "())(()("
print(ob.solve(s))
入力
"())(()("
出力
4
計算量の評価
このアルゴリズムは文字列を一度だけ走査するため、時間計算量は O(n)、使用する補助変数が定数個のみであることから空間計算量は O(1) となります。非常にシンプルかつ効率的な手法です。
-
Pythonで最長連続シーケンスの長さを求めるアルゴリズムと実装方法
問題概要ソートされていない数値の配列が与えられたとき、その中から連続する要素で構成される最長シーケンスの長さを見つける問題を考えてみましょう。ここでいう「連続」とは、値が1ずつ増えていく数列(例:4, 5, 6, 7)のことを指します。例えば、入力が nums = [70, 7, 50, 4, 6, 5] の場合、最も長い連続シーケンスは [4, 5, 6, 7] となるため、答えは 4 になります。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。まず、配列をセット(set)に変換して重複を除去します。これにより、要素の存在確認が O(1) で行えるようになります。各要素
-
Pythonで最長アナグラム部分列の長さを求めるプログラム
問題の概要小文字のみで構成された2つの文字列 S と T が与えられたとき、「最も長いアナグラム部分列」の長さを求めます。ここでアナグラム部分列とは、両方の文字列に共通して含まれる文字を組み合わせて作れる、同じ文字構成を持つ部分列のことです。例えば、S = helloworld、T = hellorld の場合、答えは 8 になります。これは、両方の文字列で共有できる文字(h ×1、e ×1、l ×3、o ×1、r ×1、d ×1)の合計が8文字であるためです。解法のアプローチこの問題は、各文字列における文字の出現回数を数え、その最小値を合計することで効率的に解けます。手順は以下の通りです。文