题目描述
猿辅导APP需要下发一些宣传文本给学生,工程师们使用了一种字符压缩算法,为了简单起见,假设被压缩的字符全部为大写字母序列,A,B,C,D,E……Z,压缩规则如下:
1. AAAB 可以压缩为 A3B(单字符压缩不加括号)
2. ABABA 可以压缩为 (AB)2A (多字符串压缩才加括号)
输入数据保证不会出现冗余括号,且表示重复的数字一定合法且大于1,即不会出现:
(A)2B ---------(应为:A2B)
((AB))2C ---------(应为:(AB)2C)
(A)B ---------(应为:AB)
A1B ---------(应为:AB)
注意:数字可能出现多位数即 A11B 或者 (AB)10C 或者 A02这种情况
A11B = AAAAAAAAAAAB
(AB)10C = ABABABABABABABABABABC
A02 = AA
数据分布:
对于60%的数据,括号不会出现嵌套,即不会有((AB)2C)2 这种结构。
对于80%的数据,括号最多嵌套1层-,不会有(((AB)2C)2D)99这种结构。
对于100%的数据,括号可以嵌套任意层
输入描述:
第一行是正整数C(C<=100),表示下面有C组数据。
之后C行,每一行为一组数据,每组数据为一个字符串。
每个字符串由A-Z,0-9,(,),组成表示一个压缩后的串,保证输入数据一定合法且字符串长度小于50
5
A11B
(AA)2A
((A2B)2)2G
(YUANFUDAO)2JIAYOU
A2BC4D2
输出描述:
输出C行,每行读音一个数据的输出结果,表示压缩前的字符串,保证每个字符串展开的长度不超过10^6.
AAAAAAAAAAAB
AAAAA
AABAABAABAABG
YUANFUDAOYUANFUDAOJIAYOU
AABCCCCDD
public class Main {
public static void main(String [] str){
System.out.println(parse("((A2B)2)2G"));
}
public static String parse(String str){
StringBuilder sb = new StringBuilder();
LinkedList<Integer> len = new LinkedList<>();
String temp = ""; // 记录括号内的字符串
// 针对字符串,处理顺序依次为:去括号,统计出现次数,拼接结果
for(int i=0;i<str.length();i++){
char c = str.charAt(i);
if(c == '('){
len.add(sb.length());
continue;
}
if(c == ')'){
// 移除上一个括号开始时的下标
int newLeftIndex = len.remove(len.size()-1);
temp = sb.substring(newLeftIndex);
i++;
}
// 处理数字
int start = i;
while (i<str.length() && str.charAt(i)>='0' && str.charAt(i)<='9'){
i++;
}
// 获取字符后面的数字
if(i-start>=1){
int count = Integer.valueOf(str.substring(start,i));
for(int k=0;k<count-1;k++){
if (temp==""){
sb.append(str.charAt(start-1));
}else {
sb.append(temp);
}
}
temp = "";
i--;//若存在数字,此时i指向的字符并没有经过上述判断,所以需要减去1.
}else {
sb.append(str.charAt(i));
}
}
return sb.toString();
}
}