java - Java / 解压字符串 /
问题描述
如何解压字符串?输入是一个包含字母、数字和符号形式的字符串,输出是一个包含重复子字符串的字符串。
示例:输入:2[qwe]4[qw]e 输出:qweqweqwqwqwqwe
一个重复可能包含另一个。例如:2[3[q]w] = qqqwqqqw
可惜我只能分组件
==================================================== ======================
StringBuilder alphabetsBuilder = new StringBuilder();
StringBuilder numbersBuilder = new StringBuilder();
StringBuilder symbolsBuilder = new StringBuilder();
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
int ch2 = string.charAt(i);
if (Character.isAlphabetic(ch)) {
alphabetsBuilder.append(ch);
} else if (Character.isDigit(ch)) {
numbersBuilder.append(ch2);
} else {
symbolsBuilder.append(ch);
}
}
System.out.println("Alphabets in string: " + alphabetsBuilder.toString());
System.out.println("Numbers in String: " + numbersBuilder.toString());
System.out.println("Symbols in String: " + symbolsBuilder.toString());
解决方案
这个问题有很多不同的方法。您可以编写一个解析器,它将递归处理字符串,在循环中使用正则表达式替换等。其中一种可能性是表达式的迭代展开。在每个步骤中,您都尝试找到最里面的一对括号并将其替换为重复多次的相应子字符串。例如,考虑以下输入字符串:
2[3[q]w]e3[q]
首先使用 anindexOf(']')
定位字符串中的第一个右括号,它将在位置 5 处找到(请记住,字符串中的位置以 0 开头):
2[3[q]w]e3[q]
^
|
position 5
然后你取这个位置之前的子字符串:
2[3[q]
并在此处找到最后一个左括号lastIndexOf('[')
,它将在位置 3 处找到括号:
2[3[q]
^
|
position 3
现在你需要提取这个左括号前面的数字,你会得到重复次数:'3'。因此,现在您获取所有这些信息:重复次数和括号之间的子字符串以生成替换:
3[q] => qqq
现在您在原始字符串中进行此替换:
2[3[q]w]e3[q] => 2[qqqw]e3[q]
现在你从头开始重复整个过程。
您搜索第一个右括号,在这里找到它:
2[qqqw]e3[q]
^
在前面的子字符串中找到最后一个左括号:
2[qqqw]
^
提取重复次数:2,并进行替换
2[qqqw] => qqqwqqqw
替换为原始字符串:
2[qqqw]e3[q] => qqqwqqqwe3[q]
再次重复整个过程,这将导致更换
qqqwqqqwe3[q] => qqqwqqqweqqq
此时,您将尝试重复整个过程,但找不到任何右括号,因此您停止并打印结果:
qqqwqqqweqqq
推荐阅读
- sql - 从表插入到表的最快方法
- inheritance - 疑难解答如何继承Odoo12中的字段(500 Internal Server Error)
- python - Python:生成具有最小和最大位数的唯一随机数列表
- angular - 如何打开 MatDialog 并传递 MatDialogRef
- php - 使用图像修补程序/laravel 填充数据库
- laravel - 如何恢复提交 .gitignore 后消失的 .env 文件
- python-3.x - 主类的第二帧中的小部件不出现
- hadoop - 在 Hue 中授予组和角色的访问权限无效
- python-3.x - 我可以将 savfig 发送到 python 电报机器人吗
- angular - ngrx 角度的当前状态