问题描述
小U拿到了一个通过特殊方式压缩的字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。请帮助小U解压这个字符串并输出最终的解压结果。
测试样例
样例1:
输入:
s = "a2b3c4"
输出:'aabbbcccc'
样例2:
输入:
s = "d5ef2"
输出:'dddddeff'
样例3:
输入:
s = "x3y1z"
输出:'xxxyz'
题目解析
这道题的核心是解压一个经过特殊压缩的字符串。字符串中的模式是:
- 字母 + 数字,表示字母需要在结果中重复相应的次数。
- 字母单独出现,则表示该字母仅在结果中出现一次。
我们需要逐字符解析字符串并根据规则进行解压。
解题思路
-
遍历字符串:
- 遍历字符串时,每次遇到一个字母时,检查其后是否跟随数字。
-
判断是否有数字:
- 如果当前字母后有数字,则获取该数字并重复字母。
- 如果没有数字,则字母只添加一次。
-
构造结果:
- 使用
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
}
}
复杂度分析
-
时间复杂度:
- 每个字符最多被遍历一次,且数字部分最多拼接和解析一次,因此时间复杂度为 O(n) ,其中
n是字符串的长度。
- 每个字符最多被遍历一次,且数字部分最多拼接和解析一次,因此时间复杂度为 O(n) ,其中
-
空间复杂度:
- 使用了
StringBuilder存储结果,最坏情况下结果长度可能为输入长度的若干倍,因此空间复杂度为 O(m) ,其中m是解压后的字符串长度。
- 使用了