面试题:手写一个字符串解码函数

176 阅读1分钟

题目

请编写一个字符串解码函数 unzip(str),可以把压缩后的字符串展开。比如:

  • 输入字符串 2[a]3[b],返回 aabbb
  • 输入字符串 2[ac2[b]],返回 acbbacbb

解题

从输入输出,可以看出规律:阿拉伯数字表示重复次数,方括号表示重复字符串;另外,方括号可以嵌套。

如果暂不考虑嵌套,那么可以使用正则表达式,结合字符串替换实现基本功能:

function unzip(str) {
    const reg = /(\d+)\[(\w+)\]/g;
    return str.replace(reg, (_, a, b) => {
        return new Array(+a).fill(b).join('');
    });
}

console.log(unzip('2[a]3[b]'));
// => aabbb
console.log(unzip('2[a3[b]]'));
// => 2[abbb]

嵌套解码可以在上述基础上,使用循环从里到外重复解码实现:

function unzip(str) {
    const reg = /(\d+)\[(\w+)\]/g;
    let result = str;

    while (reg.test(result)) {
        result = result.replace(reg, (_, a, b) => {
            return new Array(+a).fill(b).join('');
        });
    }

    return result;
}

console.log(unzip('2[a3[b]]'));
// => abbbabbb