前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字符串解码

字符串解码

作者头像
你的益达
发布2020-08-05 12:03:54
5570
发布2020-08-05 12:03:54
举报

问题描述:

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: 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"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决方案:

该问题和后缀表达式求值类似,考察栈的使用。

定义一整型栈numStack用于存储数字,再定义一字符型栈charStack用于存储字符串。

遍历给定字符串,将遇到的数字字符串组合成真实数字存入numStack,遇到到左括号和其他字符一律压入charStack,遇到右括号时首先从数字栈中弹出一个数字(即为当前串出现的次数)记做k,然后依次从字符栈中弹出字符加以存储,直到出现左括号,然后将存储的字符从后往前放入字符栈,放入k次。最终字符栈中的元素即为所求。

代码如下:

class Solution {
    public String decodeString(String s) {
        Stack<Integer> numStack = new Stack<>();
        Stack<Character> charStack = new Stack<>();
        int num = 0;
        for(int i = 0; i < s.length(); i++){
            char cur = s.charAt(i);
            if(cur >= '0' && cur <= '9'){
                num = num * 10 + cur - '0';
            }else if(cur != ']'){
                charStack.push(cur);
                if(num != 0){
                    numStack.push(num);
                    num = 0;
                }
            }else{  // cur == ']'
                StringBuilder sb = new StringBuilder();
                while(charStack.peek() != '['){
                    sb.append(charStack.pop());
                }
                charStack.pop(); // 弹出左括号
                int val = numStack.pop();
                for(int j = 0; j < val; j++){
                    for(int k = sb.length() - 1; k >= 0; k--){
                        charStack.push(sb.charAt(k));
                    }
                }
            }
        }
        StringBuilder ans = new StringBuilder();
        while(!charStack.isEmpty()){
            ans.append(charStack.pop());
        }
        return ans.reverse().toString();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述:
  • 解决方案:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档