2023华为OD机试真题-简单的解压缩算法(JAVA、Python、C++)

题目描述:
现需要实现一种算法,能将一组压缩字符串还原成原始字符串,还原规则如下:
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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值