JavaScriptで括弧の組み合わせが有効かどうかを判定する方法
問題の概要
文字列 str を引数として受け取り、その文字列に含まれるのが '('・')'・'{'・・'['・']' の6種類の括弧だけであるとき、その文字列が「有効」かどうかを判定するJavaScript関数を作成します。
有効な文字列の条件
入力文字列が有効とみなされるのは、以下の両方の条件を満たしている場合です。
開き括弧は、必ず同じ種類の閉じ括弧で閉じられていること。
開き括弧は、正しい順序で閉じられていること。
具体例
"()"… 正しい組み合わせのため有効です。"()[]{}"… 複数種類の括弧が正しい順序で対応しているため有効です。"(]"… 開き括弧と閉じ括弧の種類が一致していないため無効です。
アルゴリズムのポイント:スタックを活用する
この種の問題は「スタック」を使うのが定石です。手順は以下のとおりです。
開き括弧を見つけたら、スタックにプッシュします。
閉じ括弧を見つけたら、スタックからポップした開き括弧と対応関係が一致するかを確認します。一致しなければ即座に false を返します。
ループ終了後にスタックが空であれば、すべての括弧が正しく対応しているため true を返します。
サンプルコード
const str = "()[]{}";
const isValid = (str = '') => {
const map = new Map();
map.set('{', '}');
map.set('(', ')');
map.set('[', ']');
const b = [];
for(let i = 0; i < str.length; i++){
if(map.has(str.charAt(i))){
b.push(str.charAt(i));
} else {
const pop = b.pop();
if(map.get(pop) !== str.charAt(i)){
return false;
}
}
}
return b.length === 0;
};
console.log(isValid(str));
console.log(isValid("(]"));
ここでは、Mapオブジェクトを使って開き括弧と閉じ括弧の対応表を定義し、配列 b をスタックとして利用しています。
実行結果
コンソールには次のように出力されます。
true false
1つ目の出力 true は "()[]{}" が有効なことを示し、2つ目の出力 false は "(]" が無効なことを示しています。
-
JavaScriptで不正な時間文字列(HH:MM:SS)を正規化して修正する方法
JavaScriptでは、「HH:MM:SS」形式の時間文字列を扱う場面がよくあります。しかし、時間の加算処理などで計算ミスが発生すると、分や秒が60を超えてしまう「壊れた」時間文字列が生成されることがあります。この記事では、そうした不正な時間文字列を正しく正規化する方法を解説します。 課題:壊れた時間文字列とは 今回求められるのは、JavaScriptで「HH:MM:SS」形式の時間文字列を受け取り、必要な修正を加えた上で、正しい時間文字列として返す関数を作成することです。 問題になるのは、加算処理のバグによって、次のような不正な値が含まれてしまうケースです。 MM(分)の部分が60を超え
-
【JavaScript】反対方向の移動を打ち消して最終的な進行方向を求める方法
問題1文字ずつの要素からなる配列 arr を唯一の引数として受け取り、配列全体の移動をすべて計算した結果として残る「最終的な方向」を返す JavaScript 関数を作成します。配列に含まれるのは次の4種類の文字のみです。N → 北(North)方向へ単位距離だけ移動S → 南(South)方向へ単位距離だけ移動W → 西(West)方向へ単位距離だけ移動E → 東(East)方向へ単位距離だけ移動各文字はその方向への1単位分の移動を表します。ここで重要なルールとして、配列内で互いに反対向きの組み合わせ、すなわち (S と N) または (E と W) が隣接して現れた場合、それらは互いの移動