leetcode394-字符串解码

原题

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

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例:

s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.

解法

思想

DFS,只处理字符串中不包含括号的,遇到带括号的将其分解。

代码

class Solution {
    public String decodeString(String s) {
        return multify(1,s);
    }
    public String multify(int repeat,String s){
        StringBuilder sb = new StringBuilder();
        //字符串中不带括号
        if(s.indexOf('[') == -1){
            for(int i = 0;i<repeat;i++){
                sb.append(s);
            }
            return sb.toString();
        }else{
            //未匹配括号的个数
            int count = 0;
            //第一个数字出现的index
            int firstNumberIndex = 0;
            //第一个左括号出现的index
            int firstLeftIndex = 0;
            boolean firstNumberHasShown = false;
            for(int i = 0;i<s.length();i++){
                //如果是数字记录第一个数字出现的index
                if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
                    if(firstNumberHasShown == false){  
                        firstNumberIndex = i;
                        firstNumberHasShown = true;
                    }
                }
                //如果是左括号记录第一个左括号出现的index
                else if(s.charAt(i) == '['){
                    if(count == 0)
                        firstLeftIndex = i;
                    count ++;
                }
                //如果是右括号则未匹配的左括号数量减一,如果全部匹配完则把repeat和substring递归处理。
                else if(s.charAt(i) == ']'){
                    count --;
                    if(count == 0) {
                        firstNumberHasShown = false;
                        int repeatNum = Integer.valueOf(s.substring(firstNumberIndex,firstLeftIndex));
                        String subString = s.substring(firstLeftIndex+1,i);
                        sb.append(multify(repeatNum,subString));
                    }   
                }
                else if(count==0){
                    sb.append(s.charAt(i));
                }
            }
        }
        return multify(repeat,sb.toString());
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode394-%e5%ad%97%e7%ac%a6%e4%b8%b2%e8%a7%a3%e7%a0%81/

(0)
彭晨涛彭晨涛管理者
上一篇 2019年12月12日
下一篇 2019年12月14日

相关推荐

  • leetcode287-寻找重复数

    原题 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 …

    2020年1月7日
    0140
  • 剑指offer35-复杂链表的复制

    原题(来源Leetcode) 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random …

    2020年6月13日
    0110
  • leetcode111-二叉树的最小深度

    原题 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,nul…

    算法 2020年3月25日
    0220
  • leetcode23-合并K个排序链表

    原题 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->…

    算法 2020年2月4日
    0170
  • leetcode101-对称二叉树

    原题 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。     1  &nbsp…

    算法 2020年1月11日
    0120
  • leetcode47-全排列II

    原题 给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解法 思想 这道题…

    算法 2020年5月10日
    0100
  • leetcode1162-地图分析

    原题 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域…

    2020年3月29日
    0180
  • 程序员面试金典17.01-不用加号的加法

    原题(来源Leetcode) 设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。 示例: 输入: a = 1, b = 1 输出: 2 提示: a, b 均可能是负数或…

    算法 2020年6月9日
    0600
  • leetcode12-整数转罗马数字

    原题 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2…

    算法 2020年2月29日
    070
  • leetcode123-买卖股票的最佳时机III

    原题 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易(你…

    算法 2020年6月16日
    01540

发表回复

登录后才能评论