写一个函数用来统计字符串中各字母出现的次数。(请用Java实现) 示例: 输入:X2Y3XZ,输出:X3Y3Z1; 输入:Z3X(XY)2,输出:X3Y2Z3; 输入:Z4(Y2(XZ2)3)2X2,输出:X8Y4Z16;
时间: 2024-02-17 11:03:27 浏览: 36
好的,以下是Java实现的函数:
```java
public static String countLetters(String str) {
Map<Character, Integer> map = new HashMap<>();
Stack<Integer> stack = new Stack<>();
int repeat = 1;
for (char c : str.toCharArray()) {
if (Character.isLetter(c)) {
map.put(c, map.getOrDefault(c, 0) + repeat);
repeat = 1; // 重置 repeat
} else if (Character.isDigit(c)) {
repeat = c - '0';
} else if (c == '(') {
stack.push(repeat);
repeat = 1; // 重置 repeat
} else if (c == ')') {
repeat = stack.pop();
}
}
StringBuilder sb = new StringBuilder();
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
sb.append(entry.getKey()).append(entry.getValue());
}
return sb.toString();
}
```
该函数使用了 Map 来保存字母的出现次数,同时使用 Stack 来保存括号内的重复次数。函数首先遍历输入字符串的每一个字符,如果是字母,则将其加入 Map 中,并更新其出现次数;如果是数字,则表示接下来的字母要重复出现多少次,将其保存在 repeat 变量中;如果是左括号,则将 repeat 压入 Stack 中,并将 repeat 重置为 1;如果是右括号,则从 Stack 中弹出重复次数,更新 repeat 变量。最后,将 Map 中的结果按照字母顺序输出到 StringBuilder 中,返回字符串即可。
示例调用代码如下:
```java
String str = "Z4(Y2(XZ2)3)2X2";
String result = countLetters(str);
System.out.println(result); // X8Y4Z16
```