解压报文

标题:解压报文 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限

为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。

压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。

def recur(origin):
    num, char = '', ''
    for pos in range(origin, len(s)):
        if s[pos].isalnum():
            num += s[pos]
        if s[pos] == '[':
            j = pos + 1
            while j < len(s):
                if s[j].isalpha():
                    char += s[j]
                    j += 1
                elif  s[j] == ']':
                    return j +1,char * int(num)
                elif s[j].isalnum():
                    new, sub = recur(j)
                    j, char = new, char + sub

while True:
    try:
        s = input().strip()
        ans, i = '', 0
        while True:
            if i >= len(s):
                break
            i, ret = recur(i)
            ans += ret
        print(ans)
    except:
        break
def get_ans(s):
    ans = ''
    n = len(s)
    i = 0
    while i < n:
        if s[i].isdigit():
            num = 0
            while s[i].isdigit():
                num = num * 10 + int(s[i])
                i += 1
            i += 1
            tmp = ''
            while s[i] != ']':
                if s[i].isdigit():
                    t = ''
                    cnt = 1 
                    while i < n and cnt > 0:
                        if s[i] == '[':
                            cnt += 1
                        elif s[i] == ']':
                            cnt -= 1
                        if cnt > 0:
                            t += s[i]
                        i += 1
                    tmp += get_ans(t)
                    break
                else:
                    tmp += s[i]
                    i += 1
            for k in range(num):
                ans += tmp
        else:
            ans += s[i]
        i += 1
    return ans
s =input()
print(get_ans(s)) //160

#include<iostream>
#include<stack>
#include<map>
using namespace std;
map<int, int> mp;
std::string solve(const string &a,int x,int y)
{
    if (x > y)
    {
        return "";
    }
    std::string ans = "";
    int num = 0;
    int i = x;
    while(1)
    {
        if (i > y) break;
        if (a[i] >= '0' && a[i] <= '9')
        {
            num = num * 10 + (a[i] - '0');
            i++;
        }
        else if (a[i] == '[')
        {
           std::string tmp = solve(a, i + 1, mp[i]-1);
           for (int i = 0; i < num; i++)
           {
               ans += tmp;
           }
           num = 0;
           i = mp[i] + 1;
        }
        else
        {
            ans = ans + a[i];
            num = 0;
            i++;
        }
    }
    return ans;
}
int main()
{
    string a;
    while (cin >> a)
    {
        int n = a.size();
        stack<int> st;
        for (int i = 0; i < n; i++)
        {
            if (a[i] == '[')
            {
                st.push(i);
            }
            else if (a[i] == ']')
            {
                int x =st.top();
                st.pop();
                mp[x] = i;
            }
        }
        cout << solve(a,0,n-1) << endl;
    }
    return 0;
}

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var s string
	fmt.Scan(&s)
	fmt.Println(re(s))
}

func re(str string) string {
	left, right := find(str)
	if left == 0 {
		return str
	}
	count, p := findCount(str, left)
	var tmp string
	for i := 0; i != count; i++ {
		tmp += str[left+1 : right]
	}
	res := str[:p] + tmp + str[right+1:]
	return re(res)
}

func find(str string) (int, int) {
	var left, right int
	for i, item := range str {
		switch item {
		case '[':
			left = i
		case ']':
			right = i
		}
		if right != 0 {
			break
		}
	}
	return left, right
}

func findCount(str string, left int) (int, int) {
	var (
		tmp   string
		point int
	)
	for i := left - 1; i >= 0; i-- {
		if str[i] < '0' || str[i] > '9' {
			break
		}
		point = i
		tmp = string(str[i]) + tmp
	}
	res, err := strconv.Atoi(tmp)
	if err != nil {
		panic(err)
	}
	return res, point
}





全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务