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;
}}