【刷题笔记】LeetCode_20:有效的括号_简单(C)

题目:有效的括号

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

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例:
输入: “([)]”
输出: false

输入: “{[]}”
输出: true

本来打算只写中等题的笔记,结果发现这道简单题我都不会做QAQ。围观了大神的答案,是用栈解决,解法好妙,我完全没想到。

大致思路是:
建立一个栈,遍历所给的字符串,如果遇到左括号就压入栈里,如果遇到右括号就比较一下栈顶的左括号是否与它匹配,若匹配,则栈顶指针-1,到下一个左括号,若不匹配,则返回false。
观察发现,有效的括号左括号和右括号都一定要有,如果出现多个括号嵌套,那最里面的肯定是未嵌套其它括号的小括号,然后是上一级括号,可以发现这个顺序和入栈的左括号出栈的顺序是一样的,所以可以通过控制栈顶指针向栈底移动来检测括号。

1.会有" ( “,” [[ "这样的用例,所以在循环结束后,要加一个对top指针的判断,因为有效的括号一定会全部匹配完,即每个右括号都能找到对应的左括号,故top一定会回到初始值-1,所以若结束后top还大于等于0,说明还有一个以上的左括号没有匹配字符串就结束了,这种情况直接返回false。

2.给的函数返回值为bool,即无论如何一定要有一个bool值返回,所以要新命名一个bool类型变量,赋予初始值,最后返回它。不可以直接分情况返回true or false,因为这样有的情况没有返回值,会报错。

3.注意题目说空字符串也是true,所以要先if判断s是否为空,若为空直接true,不为空再进行处理。

//遇到左括号就入栈,右括号就看栈顶是否与它匹配

bool isValid(char * s){

    int length = strlen(s);
    bool ans = true;
    char* stack = (char*)malloc((length+1) * sizeof(char));

    int top = -1;//栈顶指针
    int front = 0;//s的指针

    if(s)
    {
        while(s[front] != '\0')
        {
            if(s[front] == '(' || s[front] == '{' || s[front]  == '[' || top == -1)
            {
                stack[++top] = s[front];
            }
            else
            {
                if(s[front] == stack[top]+1 || s[front] == stack[top]+2)
                {
                    top--;
                }
                else
                {
                    ans = false;
                    break;
                }
            }

            front++;
        }
        if(top >= 0) ans = false; //说明没有匹配完
        return ans;
    }
    else return true;

}
发布了3 篇原创文章 · 获赞 0 · 访问量 35
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览