hdoj 1274 展开字符串(递归,栈的应用)
2016-03-19 10:22
363 查看
hdoj 1274
在我看来这题是个挺好的递归题目,对于我这种新手来说,有挺大收获。题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1274
题目大意:看案例就可以了解。
思路:当我看到这题时,第一个想法是用栈来写(因为这题的主要解决的问题是去括号,
看上去跟UVA673有点相似,事实证明这题确实可以用栈来写),
后来同学说可以用递归方法,想然这题嵌套着括号,最自然的想法是从内到外一层一层的往外剥,如何剥呢?就需要用到递归。
递归
首先解释下递归:递归就是递归,字面意思,自己调用自己。下面是搜刮的别人的总结
递归常常用于分治算法、动态规划算法中。
递归是利用大问题与其子问题间的递推关系来解决问题的。
能采用递归策略的算法一般有以下特征:
(1)为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解
(2)并且这些规模较小的问题也能采用同样的分解和综合方法,分解成更小的问题,并从这些更小的问题的解构造出规模较大问题的解
(3)特别的,当规模N = 1时,能直接得解
自己代码冗长,用别人的代码做解释。
#include <stdio.h> #include <string.h> char a[260]; bool is_num(char a) //判断是不是数字 { if(a>='0' && a<='9') return 1; return 0; } int func(int pos) //pos 表示数组下标 { while(a[pos]!=')' && pos<strlen(a)) { int k=0; //记录每个字符串前的数值 while(is_num(a[pos])) { k=k*10+a[pos]-'0'; pos++; } if(k==0) k=1; int p=-1; while(k--) //输出k次麽 { if(a[pos]=='(') p=func(pos+1); //递归的关键(输出括号里面的字符) else printf("%c",a[pos]); } if(p!=-1) pos=p; pos++; } return pos; } int main() { int n; scanf("%d",&n); while(n--) { scanf("%s",a); func(0); printf("\n"); } return 0; }
栈的应用
首先应该做一下UVA673,了解栈的最基础应用https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=614
#include <stdio.h> #include <string.h> #include <stack> using namespace std; char a[130]; char change(char a) { if(a==')') return '('; else if(a==']') return '['; return 0; } int main() { int n; scanf("%d",&n); getchar(); while(n--) { stack<char>q; gets(a); int len=strlen(a); for(int i=0;i<len;i++) { if(q.empty()) q.push(a[i]); else if(q.top()!=change(a[i])) q.push(a[i]); else q.pop(); } if(len==0||q.empty()) printf("Yes\n"); else printf("No\n"); } }
具体方法,转载http://www.07net01.com/2015/04/824258.html
相关文章推荐
- Change Queue Not Work In Unity Shader
- 40个Java多线程问题总结
- linux基本知识
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(3月19日)
- Linux驱动修炼之道-RTC子系统框架与源码分析【转】
- 浙江大学2016数学专业复试真题
- mount windows目录
- nyoj--58 最少步数
- 图论1E,cf405E
- 重写 strlen
- Linux中常用操作命令
- 数据分析入门
- iOS学习笔记—ViewController/生命周期
- WIN7右下角的声音图标不见了
- 关于VC中 error C2871: 'std' : does not exist or is not a namespace
- nyoj21 三个水杯 (BFS)
- 怎么给电脑统一设置查看文件为列表形式?
- Android开发之WebService介绍
- cocos2dx和quick的区别
- 关闭win7窗口自动排列功能的方法