LeetCode 28 と 459 の解法:KMPアルゴリズムの実装と応用
LeetCode 28: 文字列の中で最初に一致するインデックスを検索する
問題リンク: 28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
KMPアルゴリズムを使用して、部分文字列を効率的に検索します。ここでは、失敗時のバックトラックテーブル(Next/LPS配列)を構築し、メイン文字列とパターンを比較します。
Python実装例
class Solution:
def build_lps(self, pa ...
7月8日 19:57 投稿
動的計画法による部分列問題の徹底攻略:1次元・2次元、連続・非連続の各パターン
1. 不相交の線 (LeetCode 1035)
この問題は、一見すると幾何学的な制約があるように見えますが、本質的には「最長共通部分列 (LCS)」を求める問題と同じです。2つの配列間で線を引く際に交差させないという条件は、選ぶ要素の相対的な順序を維持することを意味します。
アルゴリズムの定義
dp[i][j] を、配列 data1 の最初の i 個の要素と、配列 data2 の最初の j 個の要 ...
7月7日 17:15 投稿
二分探索アルゴリズムの実践的まとめ
二分探索の基本原則
閉区間方式を推奨します。データ量が少ない場合は線形探索が適切です。探索終了時、iはtargetより大きい最初の要素を指し、jはtargetより小さい最初の要素を指します。配列にtargetが存在しない場合、挿入位置はiとなります。
74. 二次元行列探索
行列内の目標値探索手法。単一行/列の境界条件に注意。
public class MatrixSearcher {
public bool ...
7月4日 23:34 投稿
各従業員の主所属部門を特定するSQLアプローチ
従業員と部門の関係を表すテーブルにおいて、各従業員に対して主となる部門IDを特定する問題を考えます。複数の部門に所属する従業員については、primary_flagが'Y'のレコードが主部門を示します。一方、単一の部門にのみ所属する従業員については、その部門が主部門となります。
この問題を解決する代表的な方法として、UNION演算子を用いた方法があります。このアプロー ...
7月4日 18:44 投稿
バックトラッキングアルゴリズムとその応用問題
組合せ問題(Leetcode77)
// アプローチ: 1からnまでの数を再帰的に探索し、リストでk個の組み合わせが作成されたかを記録
// 各ループの開始値が前の値と重複しないように、開始インデックスを設定
class Solution {
private List<List<Integer>> 結果;
private List<Integer> 現在の組み合わせ;
private int 目標サイズ;
public ...
7月2日 17:53 投稿
動的プログラミングによる問題解決:フィボナッチ数、階段の登り方、最小コストでの階段登り
動的プログラミング問題へのアプローチ
動的プログラミング問題を解決するための5つのステップ:
DP配列(DPテーブル)とそのインデックスの意味を定義する
漸化式を決定する
DP配列の初期化方法を決定する(配列オーバーフローに注意)
計算順序を決定する
DP配列の具体例を導出する
フィボナッチ数
フィボナッチ数列(通常 F(n) で表される)は、0 と 1 から始まり、そ ...
6月24日 21:13 投稿
LeetCode問題:最小反転操作回数
問題
2612. 最小反転操作回数
整数 n と、範囲 [0, n - 1] 内の整数 p が与えられます。これらは、長さが n でインデックスが 0 から始まる配列 arr を表します。この配列では、インデックス p の位置だけが 1 で、他のすべての要素は 0 です。
同時に、整数配列 banned も与えられます。この配列には、配列内のいくつかの位置が含まれています。banned の第 i 個 ...
6月13日 20:44 投稿
Javaで学ぶリンクリストの基本操作とアルゴリズム
本日の課題
LeetCode 203. リンクリスト要素の削除
LeetCode 707. リンクリストの設計
LeetCode 206. リンクリストの反転
基本概念の整理
ノードの追加処理では、新しいノード(current.next)を先に処理し、古いノード(previous.next)を後から処理します。
ノードの削除では、現在のノードを削除するには、その前のノードを知る必要があります。そのため、currentとp ...
6月11日 21:03 投稿
LeetCodeスライディングウィンドウパターン徹底解説
スライディングウィンドウ入門
「連鎖・部分文字列・配列の問題は、まず双方向ポインタを考えよ。
双方向ポインタ三兄弟、それぞれに魅力あり。
速いポインタと遅いポインタは魔法使い、連結リスト操作に敵なし。
マージソートで中点を探し、連結リストの循環を判定。
左右ポインタが最も一般的、配列の両端から中央へ。
反転配列にはこれを頼れ、二分探索は弟分。
スライ ...
6月8日 18:46 投稿
最長有効括弧の探索:スタックと動的計画法によるアプローチ
問題の説明:
'(' と ')' のみからなる文字列が与えられます。最長の有効な(形式が正しく連続している)括弧部分文字列の長さを見つけてください。
例 1:
入力:s = "(()"
出力:2
説明:最長の有効な括弧部分文字列は "()" です
例 2:
入力:s = ")()())"
出力:4
説明:最長の有効な括弧部分文字列は "()()" です
例 3:
入 ...
6月4日 17:25 投稿