字符串匹配问题
2014-02-07 11:50
176 查看
【题目描述】
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。
【输入格式】
文件的第一行为一个整数n(0<n<20),表示以下有多少个由括号组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
【输出格式】
在输出文件中有N行,每行都是YES或NO。
【样例输入】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【样例输出】
YES
YES
YES
YES
NO
【分析】
此题比表达式括号匹配相比要复杂多了,一是增加了括号的种类,而是括号间有优先级别,所以此题不是所有的括号都直接入栈,是否入栈要看栈顶元素的优先级别是否高于当前,还有事不是有一个括回只要栈非空就可以出栈,这是还要判断栈顶元素是否是与当前括回向配对。
1.当前字符为括号时,如果栈为空直接入栈,如果非空,要比较栈顶元素与当前括号的优先级别,如果当前字符优先级别高于栈顶元素直接判定非法,否则入栈
2.当前字符为括回时,如果当前栈为空直接返回false,如果栈非空,如果栈顶元素是与挡在括回匹配的括号则栈顶元素出栈,否则返回false
3.如果遍历完栈为空则为匹配,如果非空为不匹配
此题有个技巧是要为当前的括号设定优先级别,比如'<'为1,'('为2,‘['为3,’{‘为4,括回不需要设置优先级
c++代码:
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。
【输入格式】
文件的第一行为一个整数n(0<n<20),表示以下有多少个由括号组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
【输出格式】
在输出文件中有N行,每行都是YES或NO。
【样例输入】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【样例输出】
YES
YES
YES
YES
NO
【分析】
此题比表达式括号匹配相比要复杂多了,一是增加了括号的种类,而是括号间有优先级别,所以此题不是所有的括号都直接入栈,是否入栈要看栈顶元素的优先级别是否高于当前,还有事不是有一个括回只要栈非空就可以出栈,这是还要判断栈顶元素是否是与当前括回向配对。
1.当前字符为括号时,如果栈为空直接入栈,如果非空,要比较栈顶元素与当前括号的优先级别,如果当前字符优先级别高于栈顶元素直接判定非法,否则入栈
2.当前字符为括回时,如果当前栈为空直接返回false,如果栈非空,如果栈顶元素是与挡在括回匹配的括号则栈顶元素出栈,否则返回false
3.如果遍历完栈为空则为匹配,如果非空为不匹配
此题有个技巧是要为当前的括号设定优先级别,比如'<'为1,'('为2,‘['为3,’{‘为4,括回不需要设置优先级
c++代码:
#include<iostream> #include<cstdio> #include<cstring> #include<stack> using namespace std; int n; string s[30]; void init(); bool my_judge(string); int my_pre(char); int main() { init(); return 0; } void init() { cin>>n; for(int i=1;i<=n;++i) { cin>>s[i]; if(my_judge(s[i]))cout<<"YES"<<endl; else cout<<"NO"<<endl; } } bool my_judge(string s) { stack<int> a; int k; for(int i=0;i<s.size();++i) { k=my_pre(s[i]); //取得当前字符的优先级 if(k<5)//当当前字符为括号时 { if(a.empty())//如果栈为空直接入栈 { a.push(k); continue; } else//栈非空 { if(k>a.top())return false;//如果当前字符优先级别高于栈顶,false else//如果当前字符优先级别低于或等于栈顶,则入栈 { a.push(k); continue; } } } if(k==5)//当前字符为括回时 { if(a.empty()) return false;//如果栈空,false if(s[i]=='>')//下面逐一判断如果和栈顶元素匹配则出栈,否则返回false { if(a.top()==1)a.pop(); else return false; } if(s[i]==')') { if(a.top()==2)a.pop(); else return false; } if(s[i]==']') { if(a.top()==3)a.pop(); else return false; } if(s[i]=='}') { if(a.top()==4)a.pop(); else return false; } } } if(a.empty())return true;//最后如果栈空则匹配,否则不匹配 else return false; } int my_pre(char ch) { if(ch=='<')return 1; if(ch=='(')return 2; if(ch=='[')return 3; if(ch=='{')return 4; return 5; }
相关文章推荐
- C++中用栈来判断括号字符串匹配问题的实现方法
- 1005: 字符串匹配问题
- 字符串转换成整数,通配符的字符串匹配问题
- 腾讯笔试题之字符串匹配问题
- 字符串匹配问题——KMP算法理论
- 字符串匹配问题(栈)
- 素数与字符串匹配问题
- 算法实现字符串匹配问题:从三个字符串中找出共有的最长部分。
- 字符串匹配问题
- CCF-训练50题-NO.6-字符串匹配问题
- 字符串匹配问题
- hihocode的map字符串匹配问题
- 字符串匹配问题
- java实现字符串匹配问题之求两个字符串的最大公共子串
- 字符串匹配问题
- HDU 3746 字符串匹配(字符串的最小循环节问题)
- 字符串转换成整数&带通配符的字符串匹配问题
- 面试经典--字符串匹配问题
- C语言 字符串匹配问题,KMP函数-失配函数
- 工作随笔——壹(关于MYSQL数据库中字符串与字符串匹配问题)