JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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
  1. JavaScriptで文字列に含まれる母音の数を数えて返す方法

    ここでは、アルファベットを含む可能性のある文字列を引数として受け取り、その文字列の中に存在する母音(a・e・i・o・u)の個数を数えて返すJavaScript関数の作成方法を解説します。実装のポイントは以下の通りです。大文字・小文字の違いを吸収するため、toLowerCase()で文字列をすべて小文字に変換します。母音の一覧「aeiou」を判定基準(legend)として用意します。文字列を1文字ずつループで走査し、母音リストに含まれる文字であればカウントを増やします。サンプルコード以下が実際のコード例です。 {    str = str.toLowerCase(); &nb

  2. マジックストリング(魔法の文字列)問題を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」の