(java)leetcode.394——字符串解码

该篇博客详细介绍了如何解决LeetCode上的解码字符串问题,通过创建两个栈分别存储数字和字符,按照规则进行解码。文章给出了具体的Java代码实现,并提供了示例输入和输出。同时,博主分享了个人心得,提倡乐观顽强的态度面对编程挑战。
摘要由CSDN通过智能技术生成

原题地址:https://leetcode-cn.com/problems/decode-string/

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 :
输入:s = “3[a]2[bc]”
输出:“aaabcbc”

思路:数字入栈1,除了右括号之外的字符入栈2,遇到右括号则匹配栈2中的右括号,将匹配期间出栈的字符重复n(栈1栈顶数字)次。

class Solution {
        public String decodeString(String s) {
            char[] char_s = s.toCharArray();
            Stack<Integer> num = new Stack<>();
            Stack<String> str = new Stack<>();
            StringBuffer total = new StringBuffer();
            int l = s.length();
            for(int I=0;I<l;I++){
                char i=char_s[I];
                int x=0;
                if(Character.isDigit(i)){
                    while(Character.isDigit(char_s[I+x])) x++;
                    String num_string = s.substring(I,I+x);
                    num.push(Integer.valueOf(num_string).intValue());
                    I = I+x-1;
                    continue;
                }
                if(i!=']') str.push(Character.toString(i));
                else if(i==']'){
                    int n = num.pop();
                    LinkedList<String> str_tmp_i = new LinkedList<>();
                    StringBuffer str_tmp = new StringBuffer();
                    while((!str.isEmpty())&&(!str.peek().equals("["))){
                        str_tmp_i.addFirst(str.pop());//字符串后入先出,添加到首位
                    }
                    str.pop();//“[”出栈
                    for(int m=1;m<=n;m++){
                        for(String item:str_tmp_i) str_tmp.append(item);
                    }
                    if(str.isEmpty()) str.push(str_tmp.toString());
                    else {
                        if(!str.peek().equals("["))str.push(str.pop().concat(str_tmp.toString())); //不与“[”合并
                        else str.push(str_tmp.toString());
                    } //已解码的字符串入栈
                }
            }
            while(!str.isEmpty()) total.insert(0,str.pop());
            return total.toString();
        }
    }

青古の每篇一歌
《杂念》
愉快乐观努力顽强
然而杂念却未忘掉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值