LeetCode_栈_困难_394. 字符串解码

x33g5p2x  于2022-05-30 转载在 其他  
字(1.7k)|赞(0)|评价(0)|浏览(255)

1.题目

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/decode-string

2.思路

(1)栈
思路参考本题官方题解

3.代码实现(Java)

//思路1————栈
public class Solution {
    int index = 0;
    
    public String decodeString(String s) {
        //使用链表来模拟栈
        LinkedList<String> stack = new LinkedList<String>();
        index = 0;
        while (index < s.length()) {
            char cur = s.charAt(index);
            if (Character.isDigit(cur)) {
                //获取一个数字 k 并进栈(1 ≤ k ≤ 300)
                String digits = getDigits(s);
                stack.addLast(digits);
            } else if (Character.isLetter(cur) || cur == '[') {
                //获取一个字母并进栈
                stack.addLast(String.valueOf(s.charAt(index++)));
            } else {
                index++;
                LinkedList<String> sub = new LinkedList<>();
                while (!"[".equals(stack.peekLast())) {
                    sub.addLast(stack.removeLast());
                }
                Collections.reverse(sub);
                //左括号出栈
                stack.removeLast();
                //此时栈顶元素为当前 sub 对应的字符串应该出现的次数
                int times = Integer.parseInt(stack.removeLast());
                StringBuffer buffer = new StringBuffer();
                String str = getString(sub);
                //构造字符串
                while (times > 0) {
                    buffer.append(str);
                    times--;
                }
                //将构造好的字符串加入到栈中
                stack.addLast(buffer.toString());
            }
        }
        return getString(stack);
    }
    
    public String getDigits(String s) {
        StringBuffer buffer = new StringBuffer();
        while (Character.isDigit(s.charAt(index))) {
            buffer.append(s.charAt(index++));
        }
        return buffer.toString();
    }
    
    //拼接 stack 中的所有字符串并返回
    public String getString(LinkedList<String> stack) {
        StringBuffer buffer = new StringBuffer();
        for (String s : stack) {
            buffer.append(s);
        }
        return buffer.toString();
    }
}

相关文章