【LeetCode20】有效的括号——图解

​ 你好,欢迎来到我的博客!作为一名程序员,我经常刷LeetCode题目来提升自己的编程能力。在我的博客里,我会分享一些我自己做过的题目和解题思路,希望能够帮助到大家。今天,我想和大家分享一道挑战性较高的题目,让我们一起来挑战一下吧!作者也是在学习的过程中刷到有意思的题目就会选择与大家分享,并且提供较优解,关于力扣的文章全部放在博客,如果大家喜欢记得支持作者。🤓

题目难度:简单
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 3.每个右括号都有一个对应的相同类型的左括号。

示例一:

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

示例二:

输入:s = “(]”
输出:false

示例三:

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

解题思路💡

总结:题目叫我们对有效括号字符串进行判断,大概意思为,字符串输入完成后,必须保证字符串内括号全部匹配上(要求参考题目与示例),我们可以选择使用栈来存储左括号,因为最后进入的左括号会被最先拿出去匹配,符合题意按顺序闭合,要是发现有不匹配直接返回false。(接下来带来两种使用栈的解法)

本题可以说是标准的栈练习题了,如果使用C++会非常简单因为直接调用栈库函数即可,使用C语言需要手写一个(如果不了解栈的小伙伴们可以点击跳转)。

匹配成功示例

在这里插入图片描述

匹配失败示例

在这里插入图片描述
解题步骤

(第一步)

  • 写出一个,有基本的初始化、入栈、出栈、销毁等常用栈功能,方便后续调用。

(第二步)

  • 对字符串s进行遍历

(第三步)

  • 遍历字符串s,将左括号放栈中,右括号与栈顶的左括号进行匹配,匹配不成功返回false,如果字符为右括号时栈为空则直接返回false,遍历到字符串的结尾没有出现匹配失败且栈为空则返回true。

解法一⭐

typedef char STDataType;

typedef struct STNode			//栈结构体
{
    STDataType* str;
    int top;
    int capacity;
}STNode;

void STInit(STNode* pst)
{
    assert(pst);
    pst->str = NULL;
    pst->top = 0;
    pst->capacity = 0;
}

bool STEmpty(STNode* pst)
{
    assert(pst);
    return pst->top == 0;
}

void STPush(STNode* pst, STDataType data)
{
    assert(pst);
    if (pst->top == pst->capacity)
    {
        int Newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
        STDataType* temp = (STDataType*)realloc(pst->str,sizeof(STDataType) * Newcapacity);
        if (temp == NULL)
        {
            perror("malloc error");
            return;
        }
        pst->str = temp;
        pst->capacity = Newcapacity;
    }
    pst->str[pst->top++] = data;
}

void STPop(STNode* pst)
{
    assert(pst);
    assert(!STEmpty(pst));
    pst->top--;
}

void STDestroy(STNode* pst)
{
    assert(pst);
    free(pst->str);
    pst->top = 0;
    pst->capacity = 0;
}

STDataType STTop(STNode* pst)
{
    assert(pst);
    assert(!STEmpty(pst));
    return pst->str[pst->top - 1];
}

bool isValid(char* s) {
    STNode pst;
    STInit(&pst);
    while (*s)
    {
        if (*s == '(' || *s == '[' || *s == '{')
        {
            STPush(&pst, *s);
        }
        else
        {
            if (STEmpty(&pst))
                return false;
            if ((STTop(&pst) == '(' && *s != ')')
                || (STTop(&pst) == '[' && *s != ']')
                || (STTop(&pst) == '{' && *s != '}'))
            {
                return false;
            }
            else
            {
                STPop(&pst);
            }
        }
        s++;
    }
    return STEmpty(&pst);
}

解法二🌈(更优解)

其实这种解法也是使用栈的形式,只不过用数组来模拟栈来操作。
解题步骤

  • 定义一个数组来装字符串,并且定义一个top当作栈顶

  • 遍历字符串,左括号放在数组里,匹配到右括号与栈顶元素进行匹配,全部匹配成功返回true,匹配失败返回false,如果遍历到右括号时数组中没有左括号直接返回false

bool isValid(char * s)
{
    char a[10000]=" ",t;
    int i=0,top=0;
    while(s[i]!='\0')
    {
        if(s[i]=='('||s[i]=='{'||s[i]=='[')
        {
            if(s[i]=='(') t=')';
            if(s[i]=='{') t='}';
            if(s[i]=='[') t=']';
            top++;
            a[top]=t;
        }   
        else
        {
            if(a[top]!=s[i])
                return false;
            else
                top--;
        }  
        i++;
    }
    if(top==0)
        return true;
    else
        return false;
}

完结

当你喜欢一篇文章时,点赞、收藏和关注是最好的支持方式。如果你喜欢我的文章,请不要吝啬你的支持,点赞👍、收藏⭐和关注都是对我最好的鼓励。感谢你们的支持!

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值