字符串解压缩 | 豆包MarsCode AI刷题

83 阅读3分钟

问题描述

小U拿到了一个通过特殊方式压缩的字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。请帮助小U解压这个字符串并输出最终的解压结果。


测试样例

样例1:

输入:s = "a2b3c4"
输出:'aabbbcccc'

样例2:

输入:s = "d5ef2"
输出:'dddddeff'

样例3:

输入:s = "x3y1z"
输出:'xxxyz'

题目解析

这道题的核心是解压一个经过特殊压缩的字符串。字符串中的模式是:

  • 字母 + 数字,表示字母需要在结果中重复相应的次数。
  • 字母单独出现,则表示该字母仅在结果中出现一次。

我们需要逐字符解析字符串并根据规则进行解压。


解题思路

  1. 遍历字符串

    • 遍历字符串时,每次遇到一个字母时,检查其后是否跟随数字。
  2. 判断是否有数字

    • 如果当前字母后有数字,则获取该数字并重复字母。
    • 如果没有数字,则字母只添加一次。
  3. 构造结果

    • 使用 StringBuilder 来构造解压后的字符串,避免频繁字符串拼接导致的性能问题。

注:不止需要考虑1-9这种数字,应当考虑所有非负整数


示例分析

示例 1

输入:s = "a2b3c4"

  • 遍历:

    • 字母 a 后有 2,重复两次:aa
    • 字母 b 后有 3,重复三次:bbb
    • 字母 c 后有 4,重复四次:cccc
  • 输出:aabbbcccc


示例 2

输入:s = "d5ef2"

  • 遍历:

    • 字母 d 后有 5,重复五次:ddddd
    • 字母 e 无数字,出现一次:e
    • 字母 f 后有 2,重复两次:ff
  • 输出:dddddeff


示例 3

输入:s = "x3y1z"

  • 遍历:

    • 字母 x 后有 3,重复三次:xxx
    • 字母 y 后有 1,重复一次:y
    • 字母 z 无数字,出现一次:z
  • 输出:xxxyz


代码实现(java版)

public class Main {
    public static String solution(String s) {
        StringBuilder result = new StringBuilder();
        int i = 0;

        while (i < s.length()) {
            char ch = s.charAt(i);
            if (Character.isLetter(ch)) { // 当前字符是字母
                result.append(ch);
                int j = i + 1;

                // 判断下一个字符是否是数字
                StringBuilder numberBuilder = new StringBuilder();
                while (j < s.length() && Character.isDigit(s.charAt(j))) {
                    numberBuilder.append(s.charAt(j));
                    j++;
                }

                // 如果找到数字,重复字母
                if (numberBuilder.length() > 0) {
                    int count = Integer.parseInt(numberBuilder.toString());
                    for (int k = 1; k < count; k++) {
                        result.append(ch);
                    }
                }

                i = j - 1; // 跳过已处理的数字
            }

            i++;
        }

        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(solution("a2b3c4").equals("aabbbcccc")); // true
        System.out.println(solution("d5ef2").equals("dddddeff"));   // true
        System.out.println(solution("x3y1z").equals("xxxyz"));      // true
    }
}

复杂度分析

  1. 时间复杂度

    • 每个字符最多被遍历一次,且数字部分最多拼接和解析一次,因此时间复杂度为 O(n) ,其中 n 是字符串的长度。
  2. 空间复杂度

    • 使用了 StringBuilder 存储结果,最坏情况下结果长度可能为输入长度的若干倍,因此空间复杂度为 O(m) ,其中 m 是解压后的字符串长度。