jzoj解压字符串【DFS】

>Description
给你一个字符串S,S是已经被加密过的字符串。现在要求你把字符串S还原。字符串S可能会出现这样的格式:k(q),它表示字符串q重复了k次,其中q是0个或多个字符,而k是一个数字,范围是0至9。你只要把k(q)这样的格式全部展开,就能把S还原了,你要输出还原后的字符串的长度。


>Input
一行,一个字符串S。字符串S只由‘(’、‘)’、0至9的数字组成,长度不超过50。所有的括号都是能匹配的,不用判断。

>Output
一个整数,还原后的字符串的长度。答案不会超过2147483647。


>Sample Input
33(562(71(9)))

>Sample Output
19


>解题思路
递归算法:遇到一个括号,就把对应括号里面的内容递归,返回值为字符串长度。

如果当前字符不为括号,也不为括号前面的k,就直接在字符串长度上累加;
如果为括号,就找到对应右括号递推,字符串长度累加上k*返回的长度;


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s;
int lil(int l,int r) //l,r分别为起始位置,终止位置
{
	int sum=0,t=0,cyz;
	while(l<=r)
	{
		if(s[l]=='(')
		{
			cyz=1;
			for(int i=l+1;i<=r;i++) //找对应的右括号
			{
				if(s[i]=='(') cyz++; //遇到左括号说明要找的右括号要++
				if(s[i]==')') cyz--; //遇到右括号就--
				if(cyz==0) //如果括号找到(完)了
				{
					sum+=t*lil(l+1,i-1); //递归,累加上数值
			 	    l=i; t=0; //从右括号后面开始
			 	    break;
				}
			}
		}
		else if(s[l+1]=='(') t=s[l]-'0'; //如果为k的话要记录下来
		else sum++; //否则直接累加
		l++; //下一个字符
	}
	return sum;
}
int main()
{
//	freopen("b.in","r",stdin);
//	freopen("b.out","w",stdout);
	cin>>s;
	printf("%d",lil(0,s.size()-1));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/94734918