字符串展开

字符串展开

猿辅导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

posted @ 2020-03-22 00:13  别再闹了  阅读(265)  评论(0)    收藏  举报