字符串解码

字符串解码

Posted by LY on March 12, 2019

欢迎大家关注我的以下主页,尤其是今日头条!!!谢谢🙏🙏🙏

csdn:雷园的csdn博客

个人博客:雷园的个人博客

简书:雷园的简书

今日头条:来自底层程序员的仰望

前言

  1. 最近准备把算法慢慢的捡起来,但是因为工作是在太忙。所以准备不定时更一道算法题目,难度自然是由简入难,所以同学们可以不定时查看小编的更新。
  2. 北京的生活总是匆忙的,希望在北京的活着将要来北京生活的伙伴们,不要被这无情的生活淹没。最起码抽出一些时间,来做一些自己喜欢的事情。

题目:字符串解码

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

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

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

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

示例:

s1 = "3[a]2[bc]", 返回 "aaabcbc".
s2 = "3[a2[c]]", 返回 "accaccacc".
s3 = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

解题思路

  1. 由题我们可以看出输入是规范化输入,不会包含其他错误的字符或者是有括号不匹配的问题,我们可以认为输入都是正确的。

  2. 由示例字符串s1可以看出,输入中不仅包含单层括号,同时也包含多层嵌套的关系。

  3. 需要注意数字可能并不只是个位数字、字符同理,所以我们需要对数字和字符分开处理。

  4. 我们简单的说一下递归的含义:我们需要将复杂的问题进行拆分,逐步的将其转变为n个简单的小问题。例如:你怎样才能移动100个箱子?答案:你首先移动一个箱子,并记下它移动到的位置,然后再去解决较小的问题:你怎样才能移动99个箱子?最终,你的问题将变为怎样移动一个箱子。

  5. 那接下来我们对当前问题进行一下分析。

    1. 当前的问题是,字符串总包含n组数字+[字符],需对该字符串进行解码。

    2. 我们认为他只有一组数字+[字符],会有这样的解:

      int count = 0;
      for (; i < s.length() && s.charAt(i) != ']'; i++) {
          if ((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'))
              sb.append(s.charAt(i));
          else {
              while ((s.charAt(i) >= '0' && s.charAt(i) <= '9')) {
                 count = count * 10 + s.charAt(i++) - '0';
              }
              i++;
              String temp = get(s);
          }
      }
      while (count != 0) {
          sb.append(temp);
          count--;
      }