JavaScriptでエンコードされた文字列をデコードする関数の実装方法
問題の概要
エンコードされた文字列が与えられ、それを処理してデコード後の文字列を返す関数を実装する必要があります。
エンコードのルールは次のとおりです。
n[encodedString]
これは、角括弧内の文字列(encodedString)が、ちょうど n 回繰り返されることを意味します。なお、n は必ず正の整数であることが保証されています。
また、入力文字列は常に有効であると仮定できます。つまり、余分な空白は含まれず、角括弧も正しく対応しているものとします。
入出力例
たとえば、入力が次のような場合を考えてみましょう。
const str = "3[a]2[bc]";
この場合、期待される出力は次のとおりです。
const output = "aaabcbc";
「a」が3回、「bc」が2回繰り返され、連結されて「aaabcbc」になっているのがわかります。
実装コード
この問題を解くためのコードは以下のようになります。
const str = "3[a]2[bc]";
const helper = (str = '') => {
return str.replace(/(\d+\[\w+\])/gi, item => {
let match = /(\d+)\[(\w+)\]/.exec(item);
let repeat = parseInt(match[1]);
let pattern = match[2];
let result = "";
while(repeat-- > 0) {
result += pattern;
}
return result;
});
};
const decodeString = function(str) {
while(/\d+\[\w+\]/gi.test(str)) {
str = helper(str);
}
return str;
};
console.log(decodeString(str));コードの解説
まず helper 関数では、正規表現 /(\d+\[\w+\])/gi を使って、「数字+角括弧で囲まれた文字列」というパターンに一致する部分を検索します。一致した各部分について、繰り返し回数(repeat)とパターン(pattern)を取り出し、while ループで指定回数だけ文字列を連結して置き換えています。
続いて decodeString 関数では、まだ展開されていない「n[...]」形式のパターンが文字列内に存在する限り、helper 関数を繰り返し適用します。これにより、「3[a2[c]]」のようなネストされたエンコーディングにも対応できる構造になっています。
出力結果
コンソールには次のように出力されます。
aaabcbc
-
JavaScriptで文字列に含まれる母音の数を数えて返す方法
ここでは、アルファベットを含む可能性のある文字列を引数として受け取り、その文字列の中に存在する母音(a・e・i・o・u)の個数を数えて返すJavaScript関数の作成方法を解説します。実装のポイントは以下の通りです。大文字・小文字の違いを吸収するため、toLowerCase()で文字列をすべて小文字に変換します。母音の一覧「aeiou」を判定基準(legend)として用意します。文字列を1文字ずつループで走査し、母音リストに含まれる文字であればカウントを増やします。サンプルコード以下が実際のコード例です。 { str = str.toLowerCase(); &nb
-
マジックストリング(魔法の文字列)問題をJavaScriptで解く方法
マジックストリングの問題概要マジックストリング(魔法の文字列)とは、「1」と「2」だけから構成され、次の性質を持つ特別な文字列です。この文字列が「マジック(魔法)」と呼ばれるのは、連続する「1」や「2」のかたまり(グループ)ごとの出現回数をつなぎ合わせると、元の文字列そのものが再現されるからです。文字列 str の最初の部分は次のようになっています。str = 1221121221221121122……str 内の連続した「1」「2」をそれぞれグループに分けると、次のようになります。1 22 11 2 1 22 1 22 11 2 11 22 ……さらに、各グループにおける「1」または「2」の