575. Decode String

本文深入探讨了一种字符串展开算法,该算法能够处理包含数字、字母和括号的表达式,将括号内的字符串根据前导数字重复指定次数。文章通过具体实例展示了算法的工作原理,并提供了一段使用栈实现的代码,旨在帮助读者理解如何在不使用递归的情况下解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
Given an expression s includes numbers, letters and brackets. Number represents the number of repetitions inside the brackets(can be a string or another expression).Please expand expression to be a string.

Have you met this question in a real interview?
Example
s = abc3[a] return abcaaa
s = 3[abc] return abcabcabc
s = 4[ac]dy, return acacacacdy
s = 3[2[ad]3[pf]]xyz, return adadpfpfpfadadpfpfpfadadpfpfpfxyz

Challenge
Can you do it without recursion?

lint code:

这道题可以使用stack 或者递归来实现

我首先选择的是stack, 以后补上递归的写法

其实是考察细节的实现,只要按照例子跑一遍基本上就知道怎么实现了

这段程序里的

  1. tempRes
  2. sb
  3. tempBuffer
    作用都是不一样的,在实现的时候还是会被自己坑到,真的是起变量名要注意

tempRes保存的是当前遇到 “]” 时候,把stack里保存的string加上当前sb里剩余的string全部取出来,用来乘以 numOfTimes, 做乘法.

tempBuffer的所用是每次把stack中的string,插入到0为index的位置,因为stack是先进后出的,我们需要维持正确的顺序,需要每次向头插入,而不是使用append()

其他的就还好了.

public class Solution {
   
    /**
     * @param s: an expression includes numbers, letters and brackets
     * @return: a string
     */
    public String expressionExpand(String s) {
        // write your code here
        // use only one stack to stack numbers and strings
        int number=0;
        StringBuffer sb = new StringBuffer();
        Stack<Object> stack = new Stack<>();

        for(int i=0;i<s.length();i++) {
            // if digit
            if(Character.isDigit(s.charAt(i))) {
                // check if cur sb buffer
                if(sb.length()>0) {
                    stack.add(sb.toString());
                    sb = new StringBuffer();
                }
                number = number * 10 + (s.charAt(i) - '0');
            } else if(s.charAt(i) == '[') {
                // stack current number
                stack.add(number);
                number = 0;
            } else if(s.charAt(i) == ']') {
                // pop up a stack, until there meets a number
                StringBuffer tempBuffer = new StringBuffer();
                while(stack.peek() instanceof String) {
                    System.out.println("str from stack:" + stack.peek());
                    tempBuffer.insert(0, (String) stack.pop());
                }
                tempBuffer.append(sb.toString());// append current strings

                int numOfTimes = (int) stack.pop();
              
                    
                String tempRes = "";
                for(int j=0;j<numOfTimes;j++) {
                    tempRes += tempBuffer;
                }
                
                stack.add(tempRes);
                sb = new StringBuffer();

            } else if(Character.isLetter(s.charAt(i))) {
                sb.append(s.charAt(i));
            }
        }

        StringBuffer res = new StringBuffer();
        while(stack.size()>0) {
            res.insert(0, stack.pop());
        }

        if(sb.length()>0) {
            res.append(sb.toString());

        }

        return res.toString();

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值