写一个函数用来统计字符串中各字母出现的次数。(请用Java实现) 示例: 输入:X2Y3XZ,输出:X3Y3Z1; 输入:Z3X(XY)2,输出:X3Y2Z3; 输入:Z4(Y2(XZ2)3)2X2,输出:X8Y4Z16;
时间: 2024-02-18 20:04:05 浏览: 118
下面是Java实现的代码:
```java
import java.util.*;
public class CountLetters {
public static void main(String[] args) {
String input = "Z4(Y2(XZ2)3)2X2";
String output = countLetters(input);
System.out.println(output);
}
public static String countLetters(String s) {
Map<Character, Integer> map = new HashMap<>();
Stack<Integer> numStack = new Stack<>();
Stack<String> strStack = new Stack<>();
StringBuilder sb = new StringBuilder();
int i = 0;
while (i < s.length()) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
int num = 0;
while (Character.isDigit(s.charAt(i))) {
num = num * 10 + (s.charAt(i) - '0');
i++;
}
numStack.push(num);
} else if (c == '(') {
strStack.push(sb.toString());
sb = new StringBuilder();
i++;
} else if (c == ')') {
String str = sb.toString();
sb = new StringBuilder(strStack.pop());
int num = numStack.pop();
for (int j = 0; j < num; j++) {
sb.append(str);
}
i++;
} else {
sb.append(c);
i++;
}
}
String str = sb.toString();
for (i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int count = map.getOrDefault(c, 0);
map.put(c, count + 1);
}
sb = new StringBuilder();
for (char c : map.keySet()) {
sb.append(c);
sb.append(map.get(c));
}
return sb.toString();
}
}
```
这个函数首先将输入的字符串解析成一个树形结构,然后遍历这个树,在遍历的过程中统计每个字母出现的次数。最后将字母和次数拼接成一个字符串并返回。
具体来说,函数中用到了一个栈来辅助解析字符串,一个 map 来统计字母出现的次数。算法的时间复杂度是 $O(n)$,其中 $n$ 是字符串的长度。
阅读全文