JavaScriptで同じ文字に挟まれた最長部分文字列の長さを求める方法
問題の概要
文字列を引数として受け取るJavaScript関数を作成する必要があります。この関数は、同じ2つの同一文字によって挟まれた部分文字列の中で最も長いものを見つけ、その長さを返します。
入力例と出力例
例えば、以下のような入力文字列を考えてみましょう。
const str = 'sadtrsewak';
この場合、期待される出力は次の通りです。
const output = 6;
なぜなら、2つの「a」の間には長さ6の部分文字列(dtrsew)が存在し、これが条件を満たす最も長い部分文字列だからです。
解決アプローチ
この問題は、各文字が最初に出現した位置を記録しておくことで効率的に解決できます。具体的には、オブジェクト(マップ)を使って各文字の初出インデックスを保存し、同じ文字が再び現れたときに、その間の距離を計算して最大値を更新していきます。
この手法により、文字列を一度走査するだけで答えが求まるため、時間計算量はO(n)となり、非常に効率的です。
実装コード
以下が実際のコードです。
const str = 'sadtrsewak';
const longestSubstringBetween = (str = '') => {
const map = {};
let res = -1;
for(let i = 0; i < str.length; i++){
const el = str[i];
if(map.hasOwnProperty(str[i])){
res = Math.max(res, i - map[el] - 1);
}else{
map[el] = i;
};
};
return res;
}
console.log(longestSubstringBetween(str));コードの解説
処理の流れを順番に見ていきましょう。
1. マップの初期化: オブジェクトmapを用意し、各文字の初出インデックスを記録できるようにします。また、結果を格納する変数resは、該当する部分文字列が存在しない場合に備えて-1で初期化します。
2. 文字列の走査: forループで文字列を先頭から順に走査し、現在の文字を変数elに格納します。
3. 出現チェック: map.hasOwnProperty()を使って、その文字がすでに出現したことがあるかどうかを判定します。
- 出現済みの場合:現在のインデックス
iから記録済みの初出インデックスを引き、さらに1を引いた値(挟まれている部分文字列の長さ)を計算し、Math.max()で最大値を更新します。 - 未出現の場合:その文字と現在のインデックスをマップに登録します。
4. 結果の返却: ループ完了後、resを返します。同一文字のペアが存在しなかった場合は-1がそのまま返されます。
実行結果
上記のコードを実行すると、コンソールには以下の出力が表示されます。
6
文字列「sadtrsewak」では、インデックス1と8にある2つの「a」の間に6文字の部分文字列が挟まれているため、正しく6が出力されます。
まとめ
本記事では、ハッシュマップを活用して各文字の初出位置を記録するシンプルかつ効率的なアプローチを紹介しました。線形時間で処理が完結するため、長い文字列に対しても高速に動作します。同様のパターンは、「2つの要素間の最大距離」を求めるさまざまな配列・文字列問題にも応用できるので、ぜひ覚えておきましょう。
-
JavaScriptのsubstring()メソッドで部分文字列を取得する方法を徹底解説
JavaScript の substring() メソッドは、2つのインデックス位置の間にある文字列の範囲を取得します。終了インデックスを省略することで、指定した位置から文字列の末尾までの文字を取り出すことも可能です。部分文字列(サブストリング)とは、大きな文字列の一部を指します。プログラマーは部分文字列を利用することで、文字列から必要なデータだけを抽出できます。例えば、ユーザーの生年月日を「日」「月」「年」の3つの変数に分割したり、ユーザーの名前から最初の2文字だけを取り出したりすることができます。本ガイドでは、JavaScript における substring の使い方を詳しく解説していき
-
JavaScriptの正規表現を使って文字列の特定部分を削除する方法
JavaScriptでは、正規表現(RegExp)と replace() メソッドを組み合わせることで、文字列の中から指定した2つの区切り文字に挟まれた部分を簡単に削除できます。基本的な考え方たとえば、括弧「( )」で囲まれたテキストを削除したい場合は、次のような正規表現パターンを使用します。/ *\([^)]*\) */g — 括弧とその中身、および前後の空白にマッチします。\( と \) — 開き括弧と閉じ括弧そのものにマッチします。[^)]* — 閉じ括弧以外の任意の文字列にマッチします。末尾の g フラグ — 文字列内のすべての該当箇所を置換対象にします。サンプルコード以下は、文字列か