博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jzoj解压字符串【DFS】
阅读量:3939 次
发布时间:2019-05-23

本文共 1087 字,大约阅读时间需要 3 分钟。

>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
#include
#include
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;}

转载地址:http://nkggn.baihongyu.com/

你可能感兴趣的文章
centos7中的网卡一致性命名规则、网卡重命名方法
查看>>
能切换环境的python
查看>>
Tmux 使用教程
查看>>
DLINK-DSN1100的安装使用记录
查看>>
openssl的学习
查看>>
watchguard ssl100恢复出厂化设置
查看>>
CentOS 一键安装Cacti 1.2.3脚本
查看>>
CentOS 7系统上制作Clonezilla(再生龙)启动U盘并克隆双系统
查看>>
fail2ban的使用-控制连接数
查看>>
btkill-连接数控制
查看>>
NAT+www的发布
查看>>
dhcp.conf
查看>>
关于win10的升级
查看>>
cacti突然不显示流量
查看>>
发现一个好工具记录一下,U盘启动ISO文件。
查看>>
centos7下配置网卡以及查询网卡UUID
查看>>
适用于旧计算机的10款最佳轻量级Linux发行版
查看>>
在VMware Workstation中批量创建上千台虚拟机
查看>>
linux常用软件收集
查看>>
linux查看桌面环境
查看>>