think
think copied to clipboard
【面试题】给定编码字符,按编码规则解码,输出字符串
编码规则:
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]
这样的格式,再分别取出count
和letter
,直接把这最小的单位进行解码,比如示例编码字符串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);
}