この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - JavaScript コーディング問題
173. 文字列を解凍する
解法:
再帰的に解凍することができます。まず、文字列を最初から最後までスキャンし、数字、開き括弧、閉じ括弧、および文字符号の各種類の文字を識別して、それらをキューに格納します。すべての文字が処理されたら、次のように再帰的に解凍します
- キューが空になるまで次のステップを繰り返します
- キューの先頭の文字が文字符号の場合は、出力に追加し、キューからポップします
- キューの先頭が数字の場合は、その数だけ数字を読み込み、開き括弧を読み込みます。その後、再帰的に解凍して、キューから読み込んだ分の要素を除去します。
- キューの先頭が開き括弧である場合、閉じ括弧が見つかるまで再帰的に解凍します。閉じ括弧以降の部分を再度処理し、キューから読み込んだ分の要素を除外します。
最後に、得られた出力を返します。以下が完全なコードです:
function uncompress(str) { let queue = []; for (let i = 0; i < str.length; i++) { const char = str.charAt(i); if (!isNaN(char)) { let num = char; while (!isNaN(str.charAt(i + 1))) { num += str.charAt(i + 1); i++; } queue.push(parseInt(num)); } else { queue.push(char); } } function recurse(queue) { let result = ""; while (queue.length > 0) { const current = queue.shift(); if (typeof current === "string") { result += current; } else if (typeof current === "number") { const subQueue = []; const openParenCount = 1; while (openParenCount > 0) { const next = queue.shift(); if (next === "(") { openParenCount++; } else if (next === ")") { openParenCount--; } else { subQueue.push(next); } } result += recurse(subQueue).repeat(current) } } return result; } return recurse(queue);}
例えば、
uncompress('3(ab2(c))') // 'abccabccabcc'
この場合、最初にキューに次の要素が格納されます。
[3, "(", "a", "b", 2, "(", "c", ")", ")"]
その後、再帰的に解凍して、出力が得られます。
uncompress(['3', '(', 'a', 'b', '2', '(', 'c', ')', ')'])
-> 'a' + 'b' + uncompress(['2', '(', 'c', ')']) * 3
-> 'a' + 'b' + ('c' + 'c') * 3
-> 'a' + 'b' + 'cc' + 'cc' + 'cc'
-> 'abccabccabcc'
よって、出力は 'abccabccabcc' になります。