zoukankan      html  css  js  c++  java
  • 解码字符串 Decode String

    2018-11-14 17:56:12

    问题描述:

    问题求解:

    方法一、递归求解

    最直观的解法就是递归来求了,并且很显然的这个问题可以使用递归来进行求解。

        public String decodeString(String s) {
            StringBuffer sb = new StringBuffer();
            int num = 0;
            for (int i = 0; i < s.length(); i++) {
                if (Character.isDigit(s.charAt(i))) {
                    num = 0;
                    while (i < s.length() && Character.isDigit(s.charAt(i))) {
                        num = num * 10 + (s.charAt(i) - '0');
                        i++;
                    }
                    i--;
                }
                else if (s.charAt(i) == '[') {
                    int count = 1;
                    int j = i;
                    while (count != 0) {
                        j++;
                        if (s.charAt(j) == '[') count++;
                        if (s.charAt(j) == ']') count--;
                    }
                    String tmp = decodeString(s.substring(i + 1, j));
                    for (int k = 1; k < num; k++) sb.append(tmp);
                    i = j;
                }
                else sb.append(s.charAt(i));
            }
            return sb.toString();
        }
    

    方法二、使用Stack求解

    使用Stack求解的时候,最核心的思路就是当遇到'['的时候将当前sb 和 num进行压栈操作,当遇到‘]’的时候将堆栈中sb 和 num取出并对当前的字符串进行num次重复并串联到sb后面。

        public String decodeString(String s) {
            StringBuffer sb = new StringBuffer();
            Stack<StringBuffer> stack1 = new Stack<>();
            Stack<Integer> stack2 = new Stack<>();
            int k = 0;
            for (char c : s.toCharArray()) {
                if (Character.isDigit(c)) k = k * 10 + c - '0';
                else if (c == '[') {
                    stack1.push(sb);
                    stack2.push(k);
                    sb = new StringBuffer();
                    k = 0;
                }
                else if (c == ']') {
                    int count = stack2.pop();
                    String tmp = sb.toString();
                    sb = stack1.pop();
                    for (int i = 0; i < count; i++) sb.append(tmp);
                }
                else sb.append(c);
            }
            return sb.toString();
        }
    
  • 相关阅读:
    ios 应用剖析
    nyist 737 相邻石子合并问题
    砝码称重 2
    HDU4614【线段树。】
    Spark安装
    广度优先搜索
    MongoDB 操作手冊CRUD 更新 update
    HiWorkV1.3版震撼公布,今日起正式公开測试!
    织梦调用父级栏目链接和名称
    使用Blender批量导出/转换模型
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/9959407.html
Copyright © 2011-2022 走看看