zoukankan      html  css  js  c++  java
  • 394. 字符串解码

     方法一:分治,递归

    class Solution {
        int index = 0; // 全局变量记录遍历到的位置
        public String decodeString(String s) {
            int n = s.length();
            StringBuilder sb = new StringBuilder();
            int num = 0;
            for(; index < s.length(); index++) {
                if(Character.isDigit(s.charAt(index))) {
                    num = num * 10 + s.charAt(index) - '0'; // 记录个数
                } else if (s.charAt(index) == '[') {
                    index++;
                    String str = decodeString(s); // 遇到左括号,递归计算这个括号内的解码字符串
                    for(int i = 0; i < num; i++) { // 然后添加
                        sb.append(str);
                    }
                    num = 0; // 置0
                } else if (s.charAt(index) == ']') {
                    return sb.toString(); // 遇到右括号结束递归返回给上一层
                } else {
                    sb.append(s.charAt(index));// 是字符就添加
                }
            }
            return sb.toString();
        }
    }

     方法二:利用辅助栈遇到右括号,依次弹出记录本次括号内的字符串

    class Solution {
        public String decodeString(String s) {
            char[] arr = s.toCharArray();
            Stack<Character> stack = new Stack<>();
            for(char c : arr) {
                if(c != ']') {
                    stack.push(c);
                } else {
                    StringBuilder sb = new StringBuilder();
                    while(!stack.isEmpty() && stack.peek() != '[') {
                        sb.append(stack.pop());
                    }      
                    stack.pop();
                    StringBuilder num = new StringBuilder();
                    while(!stack.isEmpty() && Character.isDigit(stack.peek())) {
                        num.append(stack.pop());
                    }
                    int n = Integer.parseInt(num.reverse().toString());
                    for(int j = 0; j < n; j++) {
                        for(int i = sb.length() - 1; i >= 0; i--) {
                            stack.push(sb.charAt(i));
                        }
                    }
                }
            }
            StringBuilder sb = new StringBuilder();
            while(!stack.isEmpty()) {
                sb.append(stack.pop());
            }
            return sb.reverse().toString();
        }
    }
  • 相关阅读:
    MR架构
    概念词汇
    数仓项目06:DWD层
    Informatic学习总结_day03
    oracle_创建和管理表
    oracle_使用子查询创建表
    oracle数据类型
    文本变语音引擎 ekho
    [LNOI2014]LCA
    POJ 2942 Knights of the Round Table
  • 原文地址:https://www.cnblogs.com/yonezu/p/13307790.html
Copyright © 2011-2022 走看看