网站首页 > 技术文章 正文
习题
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"
算法思路
本题的第一个难点在于嵌套括号,与栈的先进后出相互对应,所以我们可以使用栈来进行辅助
本题的第二个难点在于数字和字母都可能是连续的,所以我们可以使用两个栈,分别来保存数字和字母
定义当前字符串 str,当前数字num,数字栈numStack,字母栈strStack
遍历s中的每个字母,假设定义为current
- current 为数字时,num = num * 10 + current
- current 为字母时,str = str + current
- current 为 [ 时,将字符串和数字推入栈中,并重置它们
- current 为 ] 时,拼接字符串 str = last_str + mul * str,其中:
- last_str 是上个 [ 到当前 [ 的字符串,例如 "3[a2[c]]" 中的 a
- mul 是当前 [ 到 ] 内字符串的重复倍数,例如 "3[a2[c]]" 中的 2
复杂度分析
- 时间复杂度 O(N),一次遍历 s
- 空间复杂度 O(N)
代码
/**
* @param {string} s
* @return {string}
*/
var decodeString = function(s) {
var numStack = [],
strStack = [],
num = 0,
str = "";
for (var i = 0; i < s.length; i++) {
var current = s[i];
if (current == '[') {
numStack.push(num);
strStack.push(str);
num = 0;
str = "";
} else if (current == ']') {
str = strStack.pop() + str.repeat(numStack.pop());
} else if (isNaN(current)) { // 字母
str += current;
} else { // 数字
num = num * 10 + Number(current);
}
}
return str;
};
- 上一篇: 当下最火的前端面试题,回溯算法来了
- 下一篇: 前端学数据结构与算法:理解递归及拿力扣链表题目练手
猜你喜欢
- 2025-06-18 盘点机器人常用的几大主流SLAM算法
- 2025-06-18 蚂蚁金服软件测试工程师一面面试题(附答案)建议收藏
- 2025-06-18 142道最新的Linux面试题及解析!代码清晰直接套用
- 2025-06-18 字节跳动的算法面试题是什么难度?
- 2025-06-18 史上最全的字节跳动 Java 面试题集锦,高级 Java 工程师面试技术
- 2024-10-04 前端面试题(最近) 前端面试题2021及答案
- 2024-10-04 前端基础知识汇总(一) 前端知识梳理
- 2024-10-04 面试笔试算法题 面试算法题是手写吗
- 2024-10-04 2W字!梳理50道经典计算机网络面试题(收藏版)
- 2024-10-04 数组遍历:JavaScript算法题的解题利器
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)