括号匹配(二)

描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入
第一行输入一个正整数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 括号匹配(二)的更多相关文章

  1. nyoj 15 括号匹配(二) (经典dp)

    题目链接 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些 ...

  2. [NYOJ 15] 括号匹配(二)

    括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 给你一个字符串,里面只包含"(",")","[&qu ...

  3. nyoj 15 括号匹配(2)

    括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[" ...

  4. nyoj 15 括号匹配(二)动态规划

    当时看到(二)就把(一)做了, 一很容易,这道题纠结了好几天,直到今晚才看懂别人的代码谢,勉强才写出来.................... 不愧是难度6的题. #include <stdio ...

  5. SDUT-2134_数据结构实验之栈与队列四:括号匹配

    数据结构实验之栈与队列四:括号匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给你一串字符,不超过50个字符,可能 ...

  6. NYOJ 题目15 括号匹配(二)(区间DP)

    点我看题目 题意 : 中文题不详述. 思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解. DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配. 所以初始化的DP ...

  7. 南阳理工大学oj 题目15 括号匹配(二)

    括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 给你一个字符串,里面只包含"(",")","[&qu ...

  8. 栈的应用:表达式括号匹配检测(C)

    问题说明: 假设数学表达式中允许包含两种括号:圆括号"()"和方括号"[]",嵌套顺序任意. 正确的嵌套模式:( [ ] ( ) ).[ ( [ ] [ ] ) ...

  9. 区间dp模型之括号匹配打印路径 poj(1141)

    题目链接:Brackets Sequence 题目描写叙述:给出一串由'(')'' [ ' ' ] '组成的串,让你输出加入最少括号之后使得括号匹配的串. 分析:是区间dp的经典模型括号匹配.解说:h ...

随机推荐

  1. Unity3D脚本中文系列教程(十二)

    http://dong2008hong.blog.163.com/blog/static/4696882720140313545332/ GameObject类,继承自Object Unity场景中所 ...

  2. POJ3080Blue Jeans

    http://poj.org/problem?id=3080 题意 : 给你几个DNA序列,让你找他们的共同的最长的子串,若是子串长度小于3,就输出no significant commonaliti ...

  3. VNC Server 配置

    1. 检查vnc客户端和服务器是否已经安装: [gavin@centos ~]$ rpm -q vnc vnc-server package vnc is not installed vnc-serv ...

  4. 【转】Android 实现“再按一次退出程序”

    From:http://blog.csdn.net/ldj299/article/details/7574365 个人觉得当用户按下后退键时,出现"再按一次退出"的提示防止误操作比 ...

  5. fhq_treap 总结

    今天跟着zcg大神学了一发fhq_treap 发现在维护区间问题上fhq_treap不仅思维量小,而且代码量更小 是Splay的不错的替代品,不过至今还是有一些问题不能很好的解决 譬如查询某个数在序列 ...

  6. lintcode :最长上升连续子序列

    题目: 最长上升连续子序列 给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列.(最长上升连续子序列可以定义为从右到左或从左到右的序列.) 样例 ...

  7. CF 353C Find Maximum #205 (Div. 2)

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ]; ] ...

  8. Spring AOP: Spring之面向方面编程

    Spring AOP: Spring之面向方面编程 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解 ...

  9. OSSEC - Agent端查看命令

    命令:/opt/ossec/bin/agent_control -h注释:/opt/为安装目录 [root@redhat rules]# /opt/ossec/bin/agent_control -h ...

  10. Android Handler消息传递

    一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的原则:只允许UI线程 ...