1390字母计数

1390字母计数

字母计数
题目描述
为了压缩一个只含小写英文字母的字符串,我们使用下面的方式表示它

任一字母c是表达式
任一字母c后接一个整数n也是一个表达式,表示把字母c重复n次,n是一个没有前导零的10进制整数,且 n≥2。
如果s1,s2是表达式,那么s1s2也是表达式。
S是一个表达式,那么(S)n也是表达式,表示将S这个表达式表示的字符串重复n次,n是一个没有前导零的10进制整数,且 n≥2。
比如表达式 ((a2b)2b)2a 表示字符串aabaabbaabaabba。

现在给你一个表达式,请统计一下其中各个字符出现的次数。

输入
存在多组样例,每样一个样例,为一个字符串。 字符串只含小写英文字母,数字和括号,其长度不超过50个字符,输入数据保证符合表达式要求,且展开后的字符出现次数最高不超过109。

输出
依次输出每个样例的结果。 每个样例按照字母顺序,每个出现的字母输出一行。格式为"c : n",其中c为字母,n为出现的次数。 每个样例之后输出一个空行。

样例输入
((a2b)2b)2a
a2c3
样例输出
a : 9
b : 6

a : 2
c : 3

题解

import java.util.*;

public class Main{

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext())
        {
            String s= in.next();
            int res[]=get(s);
            for (int i = 0; i < res.length; i++) {
                char ch=(char)(i+'a');
                if(res[i]!=0)
                    System.out.println(ch+" : "+res[i]);
            }
            System.out.println("");
        }
    }
    private static int[] get(String s) {
        int res[]= new int [26];
        int l=0;
        int pre=0;
        
        while(pre<s.length()&&s.charAt(pre)!='(')pre++;
        
        for (int i = 0; i < s.length(); i++) {
            char ch=s.charAt(i);
            if(ch=='(')
                l++;
            else if(ch==')')
            {
                l--;
                if(l==0)
                    {
                        int a[]= new int [26];
                         
                        String kk=s.substring(pre+1,i);
                        a=get(kk);
                        if(i<s.length()-1)
                        {
                            char q=s.charAt(i+1);
                            int t=i+1;
                            if(Character.isDigit(q))
                            {
                                int num=0;
                                while(t<s.length()&&Character.isDigit(s.charAt(t)))
                                {
                                    num=num*10+(int)(s.charAt(t)-'0');
                                    t++;
                                }
                                i=t-1;
                                for (int j = 0; j < a.length; j++) {
                                    a[j]*=num;
                                }
                            }
                        }
                        int t=i;
                        while(t<s.length()&&s.charAt(t)!='(')t++;
                        pre=t;
                        for (int j = 0; j < a.length; j++) {
                            res[j]+=a[j];
                        }
                    }
            }
            else if (Character.isLetter(ch)&&l==0)
                res[ch-'a']++;
            else if(Character.isDigit(ch)&&l==0)
            {
                char q=s.charAt(i-1);
                if(Character.isLetter(q))
                {
                    int num=0;
                    while(i<s.length()&&Character.isDigit(s.charAt(i)))
                    {
                        num=num*10+(int)(s.charAt(i)-'0');
                        i++;
                    }
                    i--;
                    res[q-'a']+=num-1;
                }
            }
            
        
    }
        return res;

}}
posted @ 2021-08-20 15:29  sellun  阅读(121)  评论(0编辑  收藏  举报