题目描述
给定一个字符串,字符串包含数字、大小写字母以及括号(包括大括号、中括号和小括号),括号可以嵌套,即括号里面可以出现数字和括号。按照如下的规则对字符串进行展开,不需要考虑括号成对不匹配的问题,用例保证括号匹配,同时用例保证每个数字后面都有括号,不用考虑数字后面没有括号这种情况,即2a2(b)这种情况不用考虑。数字表示括号里的字符串重复的次数,开后的字符串不包含括号。
- 将字符串进行逆序展开。
- 输出最终展开的字符串。
输入描述
输入一个长度小于100的字符串。
输出描述
输出展开后的字符串。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
abc3(A)
输出
AAAcba
分析
逆序——联想到用栈。
括号展开——联想到括号匹配:遍历字符串,遇到左括号压栈,遇到右括号谈栈,一直弹到左括号的位置。
括号展开的字符串逆序:遍历字符串,遇到左括号压栈,遇到右括号弹栈,把弹出的字母记录下来,一直谈到左括号的位置, 再把弹出的字母按照重复次数压入栈, 如此遍历一趟,得到的栈便为展开后的逆序字符串顺序。
java实现:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String str = scanner.nextLine();
char[] chars = str.toCharArray();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < chars.length; i++) {
ArrayList<Character> temp = new ArrayList<>();
if (chars[i] == ')') {
while (stack.peek() != '(') {
temp.add(stack.peek());
stack.pop();
}
//ad6(b2(NM))
stack.pop();
int n = stack.peek() - '0';
stack.pop();
while (n > 0) {
for (int j = temp.size()-1; j >= 0; j--) {
stack.push(temp.get(j));
}
--n;
}
}
if (chars[i] == '(') {
stack.push(chars[i]);
}
if (chars[i] >= '0' && chars[i] <= '9') {
stack.push(chars[i]);
}
if (chars[i] >= 'a' && chars[i] <= 'z') {
stack.push(chars[i]);
}
if (chars[i] >= 'A' && chars[i] <= 'Z') {
stack.push(chars[i]);
}
}
while (!stack.isEmpty()) {
System.out.print(stack.pop());
}
}
}
}
C++实现:
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int main() {
string str;
cin >> str;
string res;
stack<char> chars;
for (int i = 0; i < str.length(); i++) {
if (str[i] == ')') {
vector<char> tmp;
while (chars.top() != '(') {
tmp.push_back(chars.top());
chars.pop();
}
chars.pop();
int count = chars.top() - '0';
chars.pop();
while (count > 0) {
for (int k = tmp.size() - 1; k >= 0; k--) {
chars.push(tmp[k]);
}
count--;
}
}
if (str[i] == '(') {
chars.push(str[i]);
}
if (str[i] >= '0' && str[i] <= '9') {
chars.push(str[i]);
}
if (str[i] >= 'a' && str[i] <= 'z') {
chars.push(str[i]);
}
if (str[i] >= 'A' && str[i] <= 'Z') {
chars.push(str[i]);
}
}
while (chars.size() != 0) {
cout << chars.top() << " ";
chars.pop();
}
}