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日

相关推荐

  • leetcode59-螺旋矩阵II

    原题 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, …

    算法 2020年5月13日
    080
  • leetcode349-两个数组的交集

    原题 给定两个数组,编写一个函数来计算它们的交集。 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例2: 输入: nums1 = [4…

    算法 2019年12月14日
    090
  • leetcode622-设计循环队列

    设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是…

    算法 2019年11月24日
    0130
  • leetcode611-有效三角形的个数

    原题 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。 示例1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用…

    2020年2月8日
    070
  • leetcode701-二叉搜索树中的插入操作

    原题 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。 注意,可能存在多种有效的插入方式,只…

    算法 2020年1月16日
    0100
  • leetcode744-寻找比目标字母大的最小字母

    原题 给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。 数组里字母的顺序是循环的。举个例子,如果目标字母tar…

    算法 2020年1月5日
    0210
  • 程序员面试金典01.07-旋转矩阵

    原题(来源Leetcode) 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到? 示例 …

    算法 2020年4月7日
    0410
  • leetcode837-新21点

    原题 爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一…

    算法 2020年6月3日
    0110
  • leetcode771-宝石与石头

    原题 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 J 中的字母不重复,J …

    算法 2019年12月26日
    0360
  • leetcode75-颜色分类

    原题 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分…

    算法 2020年4月19日
    0220

发表回复

登录后才能评论