Leetcode刷题——day5

腾讯50题之有效的括号

阿貅的目录

  • 腾讯50题之有效的括号
  • 前言
  • 一、题目要求
  • 二、题解方法(c语言)
    • 1.法一:栈+哈希表
    • 2.法二
    • 3.法三:栈(进阶版)


前言


共鸣 专注 灌输

一、题目要求

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

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:
输入:s = "()"
输出:true

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

示例 3:
输入:s = "(]"
输出:false

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

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

二、题解方法(c语言)

1.法一:栈+哈希表

思路分析:
1.利用栈存取左括号,遇到右括号则栈顶出栈看是否匹配,分析各种情况返回结果
2.利用哈希表:键为右括号,值为左括号,通过栈顶元素与哈希表返回值的对照,完成判断

char pairs(char a) {            //哈希表保存右括号的值
    if (a == '}') return '{';
    if (a == ']') return '[';
    if (a == ')') return '(';
    return 0;
}    

bool isValid(char* s) {
    int n = strlen(s);
    if (n % 2 == 1) {
        return false;
    }
    int stk[n + 1], top = 0;        //设置存储左括号的栈
    for (int i = 0; i < n; i++) {
        char ch = pairs(s[i]);
        if (ch) {
            if (top == 0 || stk[top - 1] != ch) {
                return false;
            }
            top--;
        } else {
            stk[top++] = s[i];
        }
    }
    return top == 0;
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.法二

思路分析:
1.需提前知道三种括号在ASCII码表中的位置关系,较难实现,查表知()分别是40和41;[ ]分别是91和93;{ }分别是123和125。
2.从stack1[ 1 ]开始存储数据,结束时应该指向stack1[ 0 ]

bool isValid(char * s){
    char* stack1[100001];
    int top1 = 0;
    int length = 0;
    while(*(s+length))length++;
    for(int i = 0; i < length; i++){
        if((*(s+i) == '(') || (*(s+i) == '{' || (*(s+i) == '[')))
        {
           stack1[++top1] = *(s+i); 
        }
        else if((*(s+i) == (stack1[top1]+1)) || (*(s+i) == (stack1[top1]+ 2)))
        {
            top1--;
        }
        else return 0;
    }
    if(top1)
        return 0;
    return 1;
}

作者:zhangquanwei
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/cyu-yan-li-mian-shi-jian-100-by-zhangqua-x7jg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3.法三:栈(进阶版)

思路分析:
在读取左括号时直接将对应右括号存入栈中,之后直接将右括号比较出栈即可。

bool isValid(char * s){
    char* stack = (char*)calloc(10000, sizeof(char));
    int i = 0, size = -1;
    while (i < strlen(s)) {
        if (s[i] == '(') {
            stack[++size] = ')';
        } else if (s[i] == '[') {
            stack[++size] = ']';
        } else if (s[i] == '{') {
            stack[++size] = '}';
        } else if (size == -1 || stack[size] != s[i]) {
            return false;
        } else {
            size--;
        }
        i++;
    }
    return size == -1;
}

作者:dyzahng
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/20-you-xiao-de-gua-hao-by-dyzahng-rjeu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Stay hungry. Stay foolish.

你可能感兴趣的:(leetcode刷题,leetcode,c语言,程序人生)