问题描述
小U拿到了一个通过特殊方式压缩的字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。请帮助小U解压这个字符串并输出最终的解压结果。
测试样例
样例1:
输入:
s = "a2b3c4"
输出:'aabbbcccc'
样例2:
输入:
s = "d5ef2"
输出:'dddddeff'
样例3:
输入:
s = "x3y1z"
输出:'xxxyz'
问题理解
你需要解压一个压缩字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。
数据结构选择
- 使用
StringBuilder来构建最终的解压字符串,因为StringBuilder在字符串拼接操作上比String更高效。
算法步骤
-
遍历字符串:逐个字符遍历输入的字符串。
-
识别字母和数字:
- 如果当前字符是字母,检查下一个字符是否是数字。
- 如果下一个字符是数字,解析出完整的数字(可能有多位数),然后将该字母重复相应的次数添加到
StringBuilder中。 - 如果下一个字符不是数字,直接将该字母添加到
StringBuilder中。
-
处理边界情况:
- 确保最后一个字符的处理(如果最后一个字符是字母且后面没有数字,直接添加到
StringBuilder中)。
- 确保最后一个字符的处理(如果最后一个字符是字母且后面没有数字,直接添加到
总结
通过上述步骤,你可以有效地解压字符串并构建出最终的结果。希望这些思路能帮助你更好地完成这个任务。如果你有任何具体的问题或需要进一步的代码提示,请告诉我!
public class Main {
public static String solution(String s) {
// 将输入字符串转换为字符数组
char[] str = s.toCharArray();
// 使用 StringBuilder 来构建最终的解压字符串
StringBuilder sb = new StringBuilder();
// 遍历字符数组
for (int i = 0; i < str.length; i++) {
// 如果当前字符是字母
if (Character.isLetter(str[i])) {
// 获取当前字母
char letter = str[i];
// 初始化重复次数为1
int repeat = 1;
// 检查下一个字符是否是数字
if (i + 1 < str.length && Character.isDigit(str[i + 1])) {
// 解析完整的数字
int j = i + 1;
while (j < str.length && Character.isDigit(str[j])) {
j++;
}
// 将数字字符转换为整数
repeat = Integer.parseInt(s.substring(i + 1, j));
// 更新 i 的值,跳过已经解析的数字部分
i = j - 1;
}
// 将字母重复相应的次数添加到 StringBuilder 中
for (int k = 0; k < repeat; k++) {
sb.append(letter);
}
}
}
// 返回最终的解压字符串
return sb.toString();
}
public static void main(String[] args) {
System.out.println(solution("a2b3c4").equals("aabbbcccc"));
System.out.println(solution("d5ef2").equals("dddddeff"));
System.out.println(solution("x3y1z").equals("xxxyz"));
}
}