字符串展开
字符串展开
猿辅导APP需要下发一些宣传文本给学生,工程师使用了一种字符压缩算法,为简单起见,假设被压缩的字符全部为大写字母序列,规则如下:
AAAB可以压缩为A3B(单字符压缩不加括号)
ABABA可以压缩为(AB)2A(多字符压缩才加括号)
输入数据保证不会出现冗余括号,且表示重复的数字一定合法且大于1,即不会出现:
(A)2B
((AB))2C
(A)B
A1B
(AB)1B
注意:数字可能出现多位数即A11B或者(AB)10C或者A02这种情况。
输入描述:
第一行是正整数C(C <= 100),表示下面有C组数据。之后C行,每行为一组数据,每组数据为一个字符串。
每个字符串由A-Z,数字0-9和()组成表示一个压缩后的串,保证输入数据一定合法且字符串长度小于50。
1
2
输出描述:
输出C行,每行对应一个数据的输出结果,表示压缩后的字符串,保证每个字符串展开后的长度不超过10^6。
1
示例:
5
A11B
(AA)2A
((A2B)2)2G
(YUANFUDAO)2JIAYOU
A2BC4D2
1
2
3
4
5
6
输出:
AAAAAAAAAAAB
AAAAA
AABAABAABAABG
YUANFUDAOYUANFUDAOJIAYOU
AABCCCCDD.
这个题是一类典型题,就是字符串展开问题,和字节跳动的这道题是一个类型的,我们可以用一个栈来解决:
- 如果当前字符是字母或者(,就放入栈
- 如果是数字,就把栈顶弹出来,再重新放入数字次
- 如果是),就将栈里从(开始的内容都弹出来,再读取后面的数字,将内容放入数字次(注意放入时要将读取的字符串逆序)
package com.jiading;
import java.util.*;
public class Problem14 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Deque<Character> stack=new ArrayDeque<Character>();
int num=sc.nextInt();
for(int i=0;i<num;i++){
String string=sc.next();
int len=string.length();
int j=0;
while(j<len){
char thisChar=string.charAt(j);
if(thisChar=='(' ||Character.isAlphabetic(thisChar)){
stack.push(thisChar);
j++;
}else if(Character.isDigit(thisChar)){
StringBuilder temp=new StringBuilder();
temp.append(thisChar);
j++;
while(j<len &&Character.isDigit(string.charAt(j))){
temp.append(string.charAt(j));
j++;
}
Character last=stack.pop();
for(int k=0;k<Integer.valueOf(temp.toString());k++){
stack.push(last);
}
}else if(thisChar==')'){
StringBuilder temp=new StringBuilder();
j++;
while(j<len &&Character.isDigit(string.charAt(j))){
temp.append(string.charAt(j));
j++;
}
StringBuilder forOver=new StringBuilder();
while(stack.peek()!='('){
forOver.append(stack.pop());
}
stack.pop();
for(int k=0;k<Integer.valueOf(temp.toString());k++){
for(int u=forOver.length()-1;u>=0;u--){
stack.push(forOver.charAt(u));
}
}
}
}
StringBuilder builder=new StringBuilder();
while(!stack.isEmpty()){
builder.append(stack.pollLast());
}
System.out.println(builder.toString());
}
}
}
注意在字符串拼接的时候,我们尽量用StringBuilder和StringBuffer,不要直接用String

浙公网安备 33010602011771号