力扣20. 有效的括号

本文通过一个编程问题——判断括号字符串的有效性,介绍了使用栈解决括号匹配问题的方法。通过创建动态数组模拟栈操作,检查左右括号是否正确配对。当遇到右括号时,检查栈顶是否有对应左括号,如果有则出栈,否则返回false。最后,如果栈为空则返回true,表示字符串有效。示例中展示了有效和无效的括号字符串,并提供了C语言和Python的解决方案。
摘要由CSDN通过智能技术生成

题目

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
 

示例 1:

输入:s = "()"
输出:true


示例 2:

输入:s = "()[]{}"
输出:true


示例 3:

输入:s = "(]"
输出:false


示例 4:

输入:s = "([)]"
输出:false


示例 5:

输入:s = "{[]}"
输出:true
 

提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

解析 

其实这道题并不难,这种括号匹配的问题就是用栈来实现,而栈的特点就是先进后出,后进先出。可以想象一下,先用最简单的匹配的字符串,就“()”,我们把左括号入栈,当我们读入下一个括号时,发现两个匹配,我们把左括号出栈,我们的栈最后是没有符号的

来一个稍微难一点的“({}[])”,“(”先入栈,读入下一个字符“{”,继续入栈,下一个“}”,发现与栈的顶端即数组的末端是匹配的,那么我们就把“{”出栈,下一个字符“[”入栈,读入下一个字符“]”,与栈顶“[”匹配,“[”出栈,下一个字符“)”,与栈顶“(”匹配,“(”出栈,此时栈为空

再来一个不匹配的“({)}”,第一个符号“(”入栈,继续读入下一个符号“{”入栈,再读入“)”,发现与栈顶的“{”不匹配,这时我们的程序直接返回False

在这道题中,我们也不必要去很费事的写一堆代码实现对栈的初始化,入栈,出栈等操作,我们只需要创建一个数组去模仿栈,只要具有栈的特点后进先出就ok。创建栈就是创建一个数组,入栈就是把符号放进数组中,出栈就是把数组末尾的指针减一。

此外,在C语言中,小编觉得创建一个动态的数组比较好,更加灵活的分配空间。C语言如果不事先定义好True和False的话,直接使用会报错,所以小编在C语言的程序中使用1和0代替True和False 

c语言 

bool isValid(char * s)
{
    //l存储字符串长度
    int l=strlen(s);

    //创建一个动态数组存储括号
    char *q=(char*)malloc(l*sizeof(char));

    //字符串和数组的下标
    int i=0,j=0;

    for(;i<l;i++)
    {
        //如果此时字符串为右括号,但是数组里面没有括号
        //说明没有对应的左括号,匹配失败
        if((s[i]==')'||s[i]==']'||s[i]=='}')&&j==0)
            return 0;
        
        //如果此时字符串为左括号,将该符号存储值数组中
        if(s[i]=='{'||s[i]=='('||s[i]=='[')
            q[j++]=s[i];

        //如果此时字符串为右括号,与在数组的最后一位比较
        //如果匹配成功,数组长度减一
        //下一次循环的左括号直接覆盖原来的符号
        else if(s[i]=='}'&&q[j-1]=='{')
            j--;
        else if(s[i]==')'&&q[j-1]=='(')
            j--;
        else if(s[i]==']'&&q[j-1]=='[')
            j--;

        //匹配失败
        else
            return 0;
    }

    //程序执行到此时,说明右括号全部匹配到对应的左括号
    //只需判断此时是否还有剩余的左括号
    //即数组是否为空判断字符串是否匹配成功
    if(j==0)
        return 1;
    else
        return 0;
}

python

在python中我们用列表实现栈的操作,因为我们的列表初始时设置为空列表,所以在进行入栈出栈等操作时要使用append和del函数,代码稍微冗杂,原理与C语言一样

class Solution:
    def isValid(self, s: str) -> bool:
        l=len(s)
        q=[]
        j=0
        for i in range(l):
            if (s[i]==')' or s[i]==']' or s[i]=='}') and j==0:
                return False
            if s[i]=='(' or s[i]=='{' or s[i]=='[':
                q.append(s[i])
                j+=1
            elif s[i]==')' and q[j-1]=='(':
                j-=1
                del q[j]
            elif s[i]=='}' and q[j-1]=='{':
                j-=1
                del q[j]
            elif s[i]==']' and q[j-1]=='[':
                j-=1
                del q[j]
            else:
                return False
        if j==0:
            return True
        else:
            return False
            

 python的代码小编写的确实是比C语言要长一些,而且执行后的效果也不太好,只能说还有很长的路要走

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值