think icon indicating copy to clipboard operation
think copied to clipboard

【面试题】给定编码字符,按编码规则解码,输出字符串

Open bytemofan opened this issue 6 years ago • 0 comments

编码规则:

count[letter],将letter的内容count次输出,count是0或正整数,letter是区分大小写的纯字母

示例:

const s = '3[a]2[bc]'; decodeString(s); // 返回'aaabcbc'
const s = '3[a2[c]]'; decodeString(s); // 返回'accaccacc'
const s = '2[abc]3[cd[e]]fg'; decodeString(s); // 返回'abcabccdcdcdef'

解题思路

思路一:从外往内拆,拆成如下对象格式

obj = {
	'3': {
    	'1': 'a',
        '2': {
        	'1': 'c'
        } 
    }
}

再遍历对象,输出结果。但这种做法,如果编码嵌套太多,对象可能会特别深,遍历起来效率可能会特别低,不推荐使用这种方法。

思路二:从内往外拆解编码字符串

也就是先找到最小的单位count[letter]这样的格式,再分别取出countletter,直接把这最小的单位进行解码,比如示例编码字符串3[a2[c]],找到最小的单位为2[c],再把最小的单位转化成cc,然后递归或者循环查找结果字符串,直到找不到这样的最小单位为止。

具体实现

function decodeString(str) {
        let unitRegex = /(\d?)(\[[a-z]+\])/g;
        if(!str.match(unitRegex)) return str;
        str = str.replace(unitRegex, function (match, p1, p2) {
            let s = '';
            if(!p1) p1 = 1;
            if(/\d/.test(p1)){
                for(let i = 0; i < parseInt(p1); i++ ){
                    p2 = p2.replace('[','').replace(']','');
                    s += p2;
                }
            }
            return s;
        });
        return decodeString(str);
    }

bytemofan avatar Jun 26 '18 06:06 bytemofan