1.0 括号配对

学习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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值