-
Pythonでの検索と置換:re.sub()メソッドの使い方
Pythonのreモジュールが提供する正規表現関連のメソッドの中でも、特に重要なのがsubメソッドです。文字列の中から特定のパターンを見つけて、別の文字列に置き換える際に広く使われています。 構文 re.sub(pattern, repl, string, max=0) このメソッドは、string 内で正規表現 pattern に一致するすべての箇所を repl に置き換えます。max を指定した場合は、最大でその回数までしか置き換えを行いません(省略時はすべて置き換え)。戻り値は置き換え後の文字列です。 各引数の意味は以下のとおりです。 pattern:検索対象となる正規表現パターン
-
Pythonの正規表現修飾子(フラグ)の使い方をわかりやすく解説
Pythonの正規表現では、パターンに修飾子(フラグ)を指定することで、マッチングのさまざまな挙動を制御できます。修飾子は省略可能なオプションとして与えられ、複数のフラグを同時に使いたい場合は、ビット演算子の|(OR)で連結して指定します。主な正規表現修飾子の一覧No.修飾子と説明1re.I大文字と小文字を区別せずにマッチングを行います。2re.L現在のロケール設定に従って単語を解釈します。この指定により、アルファベット系の特殊シーケンス(\w と \W)や単語境界(\b と \B)の動作が影響を受けます。3re.M$ が行末(文字列の末尾だけでなく各行の終わり)に、^ が行頭(文字列の先頭だ
-
Pythonの正規表現パターン一覧|構文と使い方を徹底解説
Pythonの正規表現パターンとはPythonの正規表現では、制御文字(+ ? . * ^ $ ( ) [ ] { } | \)を除くすべての文字は、その文字自身に一致します。これらの特殊な意味を持つ制御文字(メタ文字)をリテラルとして扱いたい場合は、直前にバックスラッシュ(\)を付けてエスケープします。この記事では、Pythonで利用できる正規表現の構文を一覧形式でわかりやすく解説します。パターンの書き方に迷ったときのリファレンスとしてご活用ください。Pythonで使える正規表現の構文一覧番号パターン説明1^行の先頭に一致します。2$行の末尾に一致します。3.改行以外の任意の1文字に一致しま
-
Pythonで解く「最大の水を溜められるコンテナ」問題 ― 二ポインタ法による効率的な実装
問題の概要n個の非負整数 a1, a2, ..., an が与えられ、それぞれの値は座標 (i, a[i]) 上の点を表すものとします。i番目の縦線は、端点 (i, a[i]) と (i, 0) を結ぶ線分です。この中から2本の線を選び、x軸とともにコンテナ(容器)を形成したときに、最も多くの水を溜められる組み合わせを見つけるのがこの問題の目的です。例えば、配列が [1,8,6,2,5,4,8,3,7] の場合を考えてみましょう。図の網掛け部分では、高さが7、横幅が7区間あるため、合計面積は 7 × 7 = 49 となります。これが求める出力です。解法のアプローチ(二ポインタ法)この問題は「二
-
Pythonで3Sum問題を解く:合計が0になる3つの数の組み合わせを見つけるアルゴリズム
整数型の配列が与えられ、その中に a + b + c = 0 を満たす3つの要素 a、b、c が存在するとします。この条件を満たすすべての一意なトリプレット(3つ組)を見つけるのが、古典的なアルゴリズム問題「3Sum」です。 例えば、配列が [-1, 0, 1, 2, -1, -4] の場合、答えは [[-1, -1, 2], [-1, 0, 1]] となります。同じ数字の組み合わせが重複して出力されない点に注意してください。 解法のアプローチ この問題を効率的に解くには、ソート+双方向ポインタ(Two Pointers)という手法を用います。手順は以下の通りです。 配列 nums を昇順に
-
Pythonで解く!電話番号からすべての文字の組み合わせを生成する方法
2〜9までの数字を含む文字列が与えられたとき、その番号が表しうるすべての文字の組み合わせを返すことを考えます。以下は、電話のダイヤルボタンと同じように、各数字に割り当てられた文字のマッピングです。なお、「1」はどの文字にも対応しない点に注意してください。 12a b c3d e f4g h i5j k l6m n o7p q r s8t u v9w x y z*0# たとえば、入力として「23」が与えられた場合、生成される可能性のある文字列は次のようになります。 [ad, ae, af, bd, be, bf, cd, ce, cf] 解法のアプローチ この問題は、再帰的なバックトラッキングを
-
Pythonで連結リストの末尾からN番目のノードを削除する方法
連結リストがあるとします。このリストの末尾からN番目のノードを削除し、削除後のリストの先頭(head)を返す必要があります。例えば、リストが [1, 2, 3, 4, 5, 6] で n = 3 の場合、返されるリストは [1, 2, 3, 5, 6] となります。解法のアプローチこの問題は「two-pointer(双ポインタ)」テクニックを使うことで効率的に解決できます。以下の手順で処理を行います。head の後にノードが存在しない場合(要素が1つのみの場合)、None を返します。front と back の両方を head に設定し、counter を 0、flag を false に初
-
【Python】バックトラッキングで有効な括弧の組み合わせをすべて生成する方法
問題の概要整数 n が与えられたとき、開き括弧「(」と閉じ括弧「)」がそれぞれ n 個ずつ含まれる、すべての正しく対応した括弧の組み合わせを生成することを考えます。例えば n = 3 の場合、生成される括弧のセットは次のようになります。[()()(), ()(()), (())(), (()()), ((()))]ここで「正しく対応した」とは、任意の時点で閉じ括弧の数が開き括弧の数を超えず、最終的にすべての括弧が対応関係を持つ状態を指します。この問題は LeetCode の「Generate Parentheses」でもおなじみの、バックトラッキングの代表的な例題です。解決アプローチこの問題は
-
Pythonで回転ソート済み配列からターゲットを検索する方法を解説
昇順にソートされた配列が、事前に知らされていないあるピボット(軸)を基準に回転されている状況を考えてみましょう。例えば、[0,1,2,4,5,6,7] という配列は、回転によって [4,5,6,7,0,1,2] のようになります。ここでの課題は、指定されたターゲット値をこの配列の中から探し出すことです。ターゲットが配列内に存在すればそのインデックスを返し、存在しなければ -1 を返します。なお、配列には重複した要素は含まれていないものとします。例えば、配列が [4,5,6,7,8,0,1,2] でターゲットが 0 の場合、0 はインデックス 5 の位置に存在するため、出力は 5 となります。解
-
Pythonでソート済み配列から要素の最初と最後の出現位置を検索する方法
昇順にソートされた整数型配列 A が与えられているとします。この中から、指定したターゲット値が出現する開始位置と終了位置を見つける必要があります。ターゲット値が配列内に存在しない場合は [-1, -1] を返します。例えば、配列が [2,2,2,3,4,4,4,4,5,5,6]、ターゲット値が 4 である場合、値 4 はインデックス 4 〜 7 に出現するため、出力は [4, 7] となります。解法のアプローチ:二分探索を2回行うこの問題は、二分探索(バイナリサーチ)を2回実行することで O(log n) の計算量で効率的に解けます。1回目の探索で左端(最初の出現位置)を特定し、2回目の探索で
-
Pythonで数独の盤面が有効かどうかを判定する方法
問題の概要 9×9の数独(Sudoku)盤面が与えられ、その盤面が有効(valid)であるかどうかを判定します。検証対象はすでに数字が埋められているセルのみであり、以下の3つのルールを満たす必要があります。 行のルール:各行には数字1〜9が重複なく含まれていること 列のルール:各列には数字1〜9が重複なく含まれていること ブロックのルール:盤面を区切った9つの3×3サブボックスそれぞれに、数字1〜9が重複なく含まれていること 注意したいのは、盤面が完成していなくてもよいという点です。空欄は無視し、埋まっている数字だけがルールに違反していないかを確認します。 例として、次の数独盤面を考えてみ
-
C++で文字列同士の乗算を実装する方法
文字列として与えられた2つの数値があるとします。この2つを掛け合わせ、その結果も文字列として返すことを考えます。例えば、「26」と「12」が入力された場合、出力は「312」になります。 数値をそのまま int や long long に変換して掛けることも可能ですが、非常に大きな数を扱う場合はオーバーフローが発生する恐れがあります。そこで、文字列のまま筆算をシミュレートする方法が有効です。 解決の手順 2つの数値文字列 num1 と num2 を引数として受け取ります。 m桁 × n桁の積は最大でも m+n 桁に収まるため、長さが「num1の桁数 + num2の桁数」である文字列 ans
-
Pythonでリストの全順列を生成する方法【再帰とバックトラック解説】
Pythonで順列(Permutation)を求める問題とは 重複しない整数からなるコレクションが与えられたとき、そのすべての順列(並べ替えの組み合わせ)を求めることを考えます。 たとえば、配列が [2, 1, 3] の場合、期待される結果は次の6通りです。 [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] n個の異なる要素に対する順列の総数は n!(階乗)になるため、3要素なら 3! = 6通り、4要素なら 4! = 24通りの結果が得られます。 解決の手順:再帰とバックトラック この問題は、再帰とバックトラックを組み合わせること
-
Pythonで2Dマトリクス(画像)を時計回りに90度回転させる方法
はじめにここでは、1つの画像を表す2次元マトリクス(行列)が与えられたと仮定します。この画像を時計回りに90度回転させることを目標とします。例として、以下のような3×3のマトリクスを考えてみましょう。157963213このマトリクスを時計回りに90度回転させると、出力は次のようになります。291165337解決のためのアルゴリズムこの問題を解くために、以下の手順に従います。一時的なリスト temp_mat = [] を用意し、col := マトリクスの長さ - 1 とします。col を 0 からマトリクスの長さまでループさせます。空のリスト temp := [] を作成します。row を「マト
-
Pythonで文字列をアナグラムごとにグループ化する方法
問題の概要複数の文字列が与えられたとき、それらをアナグラム(並べ替えると同じ文字になる単語)ごとにグループ化する問題を考えてみましょう。例えば、入力が [eat, tea, tan, ate, nat, bat] の場合、出力は次のようなグループになります。[[ate,eat,tea],[nat,tan],[bat]]「eat」「tea」「ate」は同じ3文字を含むため同じグループに、「tan」と「nat」も同様にグループ化され、「bat」は対応する単語がないため単独のグループになります。解決のアプローチこの問題は、以下の手順で効率的に解くことができます。結果を格納するための辞書(マップ)re
-
PythonでPow(x, n)を実装する方法|ライブラリ関数を使わずにべき乗を計算するアルゴリズム
問題の概要2つの入力 x と n が与えられたとします。x は -100.0 から 100.0 の範囲に収まる実数、n は32ビット符号付き整数です。ここでの課題は、ライブラリ関数を使用せずに x の n 乗(x^n)を求めることです。例えば、入力が x = 12.1、n = -2 の場合、出力は 0.00683 となります。解法のアプローチ:バイナリ累乗法(繰り返し二乗法)この問題は「バイナリ累乗法(繰り返し二乗法)」と呼ばれる手法で効率的に解けます。指数を2進数として扱い、計算回数を O(log n) まで削減できるのがポイントです。手順は以下の通りです。power に |n|(n の絶対
-
Pythonで3色の配列をソートする方法(オランダ国旗問題の解き方)
問題の概要 n個のオブジェクトを含む配列があるとします。各オブジェクトは赤・白・青のいずれかの色で塗られており、同じ色のオブジェクトが隣り合い、かつ赤→白→青の順に並ぶように、配列をインプレース(追加メモリを使わずに)ソートします。 ここでは、色を数値で表現し、赤=0、白=1、青=2 とします。例えば、配列が [2,0,2,1,1,0] の場合、出力は [0,0,1,1,2,2] となります。 この問題は「オランダ国旗問題」としても知られており、3つのポインタを使うことで1回の走査で効率的に解くことができます。 解法のステップ low を 0、mid を 0、high を 配列の長さ −
-
C++で組み合わせをすべて生成する方法【バックトラッキング解説】
問題概要2つの整数 n と k が与えられたとき、1 から n までの数字の中から k 個を選んで作れるすべての組み合わせを求めます。例えば、n = 4、k = 2 の場合、答えは [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]] となります。解法の考え方:バックトラッキングこの種の問題は、バックトラッキング(探索の巻き戻し)と呼ばれる手法で効率的に解くことができます。再帰関数を使って候補の数字を一つずつ選びながら組み合わせを構築し、条件を満たした時点で結果を保存していきます。アルゴリズムの手順再帰関数 solve() を用意します。引数は n、k、現在の組み合わせを
-
Pythonで数字列をアルファベットにデコードする方法の数を求める(動的計画法)
問題の概要「A」から「Z」までの英字が、以下のような対応表を使って数字にエンコードされているとします。A → 1B → 2...Z → 26ここで、数字のみで構成された空でない文字列が与えられたとき、その文字列が何通りの方法でデコードできるかを求めます。例えば、文字列が「12」だった場合、「AB」(1= A、2 = B)としても「L」(12 = L)としても解釈できるため、デコード方法は2通りあります。したがって答えは2となります。もう一つの例として「226」を見てみましょう。これは「BZ」(2, 26)、「VF」(22, 6)、「BBF」(2, 2, 6)の3通りにデコードできるため、答えは
-
Pythonで二分木の中間順トラバーサル(Inorder Traversal)を再帰なしで実装する方法
二分木(バイナリツリー)が与えられたとき、再帰を使わずに中間順トラバーサル(Inorder Traversal)で木を走査する方法を解説します。例えば、次のような二分木があるとします。この木に対して中間順トラバーサルを行うと、結果は [2,5,7,10,15,20] のようになります。中間順トラバーサルは「左の子 → 親ノード → 右の子」の順にノードを訪問するため、二分探索木の場合は値が昇順に出力されるという特徴があります。アルゴリズムの考え方再帰を使わずにスタックを活用することで、この問題を解決できます。手順は以下のとおりです。結果を格納する配列 res と、ノードを一時的に保持するスタッ