【LeetCode: 394. 字符串解码 + 栈】
🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯
🚀 算法题 🚀 |
🚩 题目链接
⛲ 题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”
提示:
1 <= s.length <= 30
s 由小写英文字母、数字和方括号 ‘[]’ 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300]
🌟 求解思路&实现代码&运行结果
⚡ 栈
🥦 求解思路
-
使用双栈:一个栈 numStack 用于存储重复次数 k,另一个栈 strStack 用于存储当前已解码的字符串。
-
遍历字符串:
-
如果当前字符是数字,则计算完整的数字值(可能有多位数字)。
-
如果当前字符是字母,则直接拼接到当前的结果字符串 sb 中。
-
如果当前字符是 [,则将当前的数字和字符串分别压入栈中,并重置 num 和 sb。
-
如果当前字符是 ],则从栈中弹出重复次数和之前的字符串,将当前结果字符串重复 k 次并拼接到之前的字符串中。
-
-
返回结果:最终 sb 中存储的就是解码后的字符串。
-
有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
class Solution {
public String decodeString(String s) {
//初始化
LinkedList<Integer> numStack = new LinkedList();
LinkedList<String> strStack = new LinkedList();
StringBuilder sb = new StringBuilder();
int num = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
num = num * 10 + c - '0';
} else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
sb.append(c);
} else if (c == '[') {
if (num > 0) numStack.push(num);
strStack.push(sb.toString());
sb = new StringBuilder();
num = 0;
} else {
//c==']'
StringBuilder preSB = new StringBuilder().append(strStack.pop());
int times = numStack.pop();
for (int j = 0; j < times; j++) {
preSB.append(sb);
}
sb = preSB;
}
}
return sb.toString();
}
}
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |
原文地址:https://blog.csdn.net/Coder_ljw/article/details/145132066
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!