括号匹配(二)
- 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
- 第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 - 输出
- 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
- 样例输入
-
4
[]
([])[]
((]
([)] - 样例输出
-
0
0
3
2 - 【分析】
- 可以运用类似栈的思想。
- 1.如果是 '(' || '[' 则压栈。
- 2.如果是')' || ']' 并且栈顶元素与之相匹配则将栈顶pop。
- 3.如果条件2的反例,则进入循环,将当前读入的元素与栈中每个元素进行比较。
- 3.1 如果匹配则跳出循环并且sum加上已尝试匹配的个数。
- 3.2 如果读到栈底也不匹配则sum+1。
- 4.输出结果应为 sum+“栈”中元素个数
- 所以其实不能用栈来做,因为要和栈中每个元素进行挨个比较,栈没有这个操作,所以应该用两个数组,来模拟栈的操作。
- 例如:(以下的“栈”应理解为数组)
- ((])) 首先将((压入“栈”,(执行第3步),然后“]”依次与“栈”中的 (( 进行比较,比较到栈底也没有元素与之相匹配(3.2),所以sum++,继续读入)),执行第2步。
- 输出的答案即为1
- (([)) 首先将(([压入“栈”,(执行第3步),然后“)”依次与“栈”中的 (([ 进行比较,比较到第一个 ( 时,与当前元素相匹配,跳出循环(3.1)。
- 输出答案即为1
- 好吧,啰嗦这么多,我也表达不清了,上代码!
- 【代码】
#include<cstdio>
#include<cstring>
int main(){
int n;
scanf("%d",&n);
while(n--){
char arry[] = {''},stack[] = {''};
scanf("%s",arry);
int len = strlen(arry),i,flag,temp,sum = ;
int top = ,k;
for(i = ;i < len;i++){
temp = flag = ;
k = top;
if(arry[i] == '(' || arry[i] == '[')
stack[top++] = arry[i];
else if(arry[i] == ')' && stack[top - ] == '(' || arry[i] == ']' && stack[top - ] == '['){
top--;
}else{
while(k!=){
if(arry[i] == ')' && stack[k - ] == '(' || arry[i] == ']' && stack[k - ] == '['){
temp = ;
top = k - ;
break;
}else{
flag += ;
}
k--;
}
if(!temp)
sum += ;
else
sum += flag;
}
}
sum += top;
printf("%d\n",sum);
}
return ;
}
当然也可以用DP的思想,先挖好坑,待研究。。。
【栈思想、DP】NYOJ-15 括号匹配(二)的更多相关文章
-
nyoj 15 括号匹配(二) (经典dp)
题目链接 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些 ...
-
[NYOJ 15] 括号匹配(二)
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[&qu ...
-
nyoj 15 括号匹配(2)
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[" ...
-
nyoj 15 括号匹配(二)动态规划
当时看到(二)就把(一)做了, 一很容易,这道题纠结了好几天,直到今晚才看懂别人的代码谢,勉强才写出来.................... 不愧是难度6的题. #include <stdio ...
-
SDUT-2134_数据结构实验之栈与队列四:括号匹配
数据结构实验之栈与队列四:括号匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给你一串字符,不超过50个字符,可能 ...
-
NYOJ 题目15 括号匹配(二)(区间DP)
点我看题目 题意 : 中文题不详述. 思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解. DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配. 所以初始化的DP ...
-
南阳理工大学oj 题目15 括号匹配(二)
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[&qu ...
-
栈的应用:表达式括号匹配检测(C)
问题说明: 假设数学表达式中允许包含两种括号:圆括号"()"和方括号"[]",嵌套顺序任意. 正确的嵌套模式:( [ ] ( ) ).[ ( [ ] [ ] ) ...
-
区间dp模型之括号匹配打印路径 poj(1141)
题目链接:Brackets Sequence 题目描写叙述:给出一串由'(')'' [ ' ' ] '组成的串,让你输出加入最少括号之后使得括号匹配的串. 分析:是区间dp的经典模型括号匹配.解说:h ...
随机推荐
-
jq pagination分页 全选、单选的思考
$().pagination(总条数,配置项); 后端分页的跨页选择: 思路:把浏览过的页整体保存为,整体拥有 curPage(当前页码).allChoice(当前页是否全选).selected当前页 ...
-
频域分辨率与DFT,DCT,MDCT理解
搞了这么久音频算法,有些细节还没有很清楚. 比如DFT和DCT有哪些区别,DFT系数为什么会是对称的,同样帧长的数据,各自的频域分辨率是多少? 今天决定搞清楚这些问题, 首先DFT的系数对称(2N点的 ...
-
hdu 2883 kebab 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2883 Almost everyone likes kebabs nowadays (Here a ke ...
-
《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记
VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...
-
HTML&;CSS基础学习笔记1.23-表单的文本域和下拉列表
文本域 <textarea>标签定义多行的文本输入控件. 平时在网页上的一些需要输入比较多的内容的输入框,比如回复帖子,回答问题等,都可以用<textarea>标签. < ...
-
linux安装php5.3
安装php的依赖包 [root@localhost admin]# unzip libxml2-2.7.8.tar.zip [root@localhost admin]#tar zvxf libxml ...
-
Rendering Problems Failed to load platform rendering library 为何打开布局页面时手机预览页面显示不出来?
看到图片右上角的 android图标没有?把它改为低版本的就可以了,如我的是21就可以了.原因我想是因为sdk版本更新了不兼容导致的吧.
-
C++:如何正确的定义一个接口类
C++中如何定义接口类?首先给接口类下了定义:接口类应该是只提供方法声明,而自身不提供方法定义的抽象类.接口类自身不能实例化,接口类的方法定义/实现只能由接口类的子类来完成. 而对于C++,其接口类一 ...
-
Spring cloud 微服务架构 Eureka篇
1 服务发现 ## 关于服务发现 在微服务架构中,服务发现(Service Discovery)是关键原则之一.手动配置每个客户端或某种形式的约定是很难做的,并且很脆弱.Spring Cloud提供了 ...
-
Python排序算法动态图形化演示(实现代码)
1.冒泡排序 冒泡排序是最简单也是最容易理解的排序方法,其原理就是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...