题目描述:
现需要实现一种算法,能将一组压缩字符串还原成原始字符串,还原规则如下:
1、字符后面加数字N,表示重复字符N次。例如:压缩内容为A3,表示原始字符串为AAA。
2、花括号中的字符串加数字N,表示花括号中的字符串重复N次。例如:压缩内容为{AB}3,表示原始字符串为ABABAB。
3、字符加N和花括号后面加N,支持任意的嵌套,包括互相嵌套。例如:压缩内容可以{A3B1{C}3}3。
输入描述:
输入一行压缩后的字符串
输出描述:
输出压缩前的字符串
补充说明:
输入保证,数字不会为0,花括号中的内容不会为空,保证输入的都是合法有效的压缩字符串
输入输出字符串区分大小写
输入的字符串长度为范围[1, 10000]
输出的字符串长度为范围[1, 100000]
数字N范围[1, 10000]
收起
示例1
输入:
A3
输出:
AAA
说明:
A3代表A字符重复3次
示例2
输入:
{A3B1{C}3}3
输出:
AAABCCCAAABCCCAAABCCC
说明:
{A3B1{C}3}3代表A字符重复3次,B字符重复1次,花括号中的C字符重复3次,最外层花括号中的AAABCCC重复3次
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Main m = new Main();
String s = sc.nextLine();
m.solution(s);
}
public void solution(String s) {
int n = s.length();
Stack<String> cs = new Stack<>();
int i = 0;
while (i < n) {
char c = s.charAt(i);
if (c == '{') {
cs.push(String.valueOf(c));
i++;
} else if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
cs.push(String.valueOf(c));
i++;
} else if (c >= '0' && c <= '9') {
int j = i;
while (j < n && s.charAt(j) >= '0' && s.charAt(j) <= '9') {
j++;
}
int time = Integer.parseInt(s.substring(i, j));
String pop = cs.pop();
String add = "";
for (int p = 0; p < time; p++) {
add += pop;
}
cs.push(add);
i = j;
} else {
String add = "";
while (!cs.isEmpty()) {
String pop = cs.pop();
if (pop.equals("{")) {
break;
}
add = pop + add;
}
cs.push(add);
i++;
}
}
String res = "";
while (!cs.isEmpty()) {
res = cs.pop() + res;
}
System.out.println(res);
}
}
#include<iostream>
using namespace std;
size_t FindEndBracket(string input, size_t i)
{
int cnt = 1;
while (i < input.size())
{
if (input[i] == '{')cnt++;
else if (input[i] == '}')
{
cnt--;
if (cnt == 0)
{
return i;
}
}
++i;
}
return -1;
}
string Decompress(string input)
{
size_t i = 0;
string result = "";
while (i < input.size())
{
char ch = input[i];
string sToRepeat = "";
if (ch == '{')
{
size_t end = FindEndBracket(input, i + 1);
sToRepeat = Decompress(input.substr(i + 1, end - i - 1));
i = end + 1;
}
else
{
while (i < input.size() && !isdigit(input[i]) && input[i] != '}' && input[i] != '{')
{
sToRepeat += input[i];
++i;
}
}
int rpcnt = 0;
while (i < input.size() && isdigit(input[i]))
{
rpcnt = rpcnt * 10 + (input[i] - '0');
++i;
}
rpcnt = max(1, rpcnt);
while (rpcnt--)
{
result += sToRepeat;
}
}
return result;
}
int main()
{
string str;
while (cin >> str)
{
cout << Decompress(str) << endl;
}
}