学习1.0 括号配对
题目:现在,有一行括号序列,请你检查这行括号是否配对。
第一行输入一个数N
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
思路分析:(还没学数据结构时的做法)
1.输入字符串奇数或者偶数为依据,简单分类一下配对问题(初学算法,不必急于解决问题,多对问题种类考虑尽量全面,再逐步深入,具体到每个问题)
2.括号最内部最小单元"()“or”[]"的一个括号整体开始删除,直到<1>字符串为空,yes
<2>字符串不为空,且不存在最小括号整体,输出no
n=int(input())
for i in range(n):
s=input()
if len(s)%2!=0:
print('No')
else:
while s!='':
if '[]' in s:
s=s.split('[]')
s=''.join(s)
elif '()' in s:
s=s.split('()')
s="".join(s)
elif '[]'or '()' not in s:
print('No')
break
if s=='':
print('Yes')
思路分析:1.对给定的字符串 s 进行遍历,当遇到一个左括号时,希望在后续的遍历中,有一个相同类型的右括号与其配对。由于后遇到的左括号要先闭合,符合后进先出的原则,可以用栈来进行处理。
2.当遇到一个右括号时,需要一个相同类型的左括号闭合。取出栈顶的左括号,判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,则字符串 s 无效,返回 false。如果遍历完字符串s后,栈为空,则字符串 s 合法,返回 true。
class Solution {
public:
bool Ismatch(const char& rhs,const char& lhs)//判断是否匹配
{
switch(lhs)
{
case '(':
return rhs==')';
case '[':
return rhs==']';
case '{':
return rhs=='}';
default:
return false;
}
}
public:
bool isValid(string s) {
if(s.size() % 2 != 0) return 0; //字符串长度不是偶数,不合法
char stk[100010];
int top = 0;
for(auto c : s)
{
if(c == '(' || c == '[' || c == '{')//做符号进栈
stk[++top] = c;
else if(top && Ismatch(c, stk[top]))//右符号与栈顶匹配,栈顶出栈
top--;
else
return false;
}
if(!top)//栈空,字符串合法
return true;
return false;
}
};