LeetCode 第四天 20. 有效的括号

LeetCode百日筑基系列主要是为了练习基础的数据结构与算法,题库全为LeetCode简单题(后面会在其他系列更新中等题和困难题),主要使用C语言和Java编写,前期的题目以完成功能为目的,后续会使用更优的算法以及优化代码块。
20. 有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:

输入:s = “()”
输出:true

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
C语言:

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 stack[n + 1], top = 0;
    for (int i = 0; i < n; i++) {
    
    
        char ch = pairs(s[i]);
        if (ch) {
    
    
            if (top == 0 || stack[top - 1] != ch) {
    
    
                return false;
            }
            top--;
        } else {
    
    
            stack[top++] = s[i];
        }
    }
    return top == 0;
}

解题思路:有效括号字符串的长度,一定是偶数。右括号前面,必须是相对应的左括号,才能抵消。右括号前面,不是对应的左括号,那么该字符串,一定不是有效的括号。那么如遇左括号,则压入栈,如遇右括号,弹出栈顶,两者对应,则抵消。若弹出的栈顶如“{”与“{”不是对应关系则返回false。
Java:

class Solution {
    
    
    public boolean isValid(String s) {
    
    
        int n = s.length();
        if (n % 2 == 1) {
    
    
            return false;
        }

        Map<Character, Character> pairs = new HashMap<Character, Character>() {
    
    {
    
    
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};
        Deque<Character> stack = new LinkedList<Character>();
        for (int i = 0; i < n; i++) {
    
    
            char ch = s.charAt(i);
            if (pairs.containsKey(ch)) {
    
    
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
    
    
                    return false;
                }
                stack.pop();
            } else {
    
    
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}

IsValid()
检查对象变量是否已经实例化,即实例变量的值是否是个有效的对象。
语法IsValid ( objectname )
参数objectname 要检测的对象名
返回值为Boolean。如果指定对象已经创建了对此案实例,那么IsValid()函数返回True,否则返回FALSE。如果参数obejctname的值为NULL,IsValid()函数返回NULL。

isEmpty()
是一个判断数列A是否为空的一个函数。
用法:C = isempty(A):
假如A为空的话,返回的值是1
假如A为非空的话,返回的值是0

pop和peek:
peek,pop都是返回栈顶元素;
peek()函数返回栈顶的元素,但不弹出该栈顶元素;
pop()函数返回栈顶的元素,并且将该栈顶元素出栈

add和push:
add,push都可以向stack中添加元素;
add是继承自Vector的方法,且返回值类型是boolean;
push是Stack自身的方法,返回值类型是参数类类型;

containsKey()方法判断是否包含指定的键名
在HashMap中经常用到containsKey()来判断键(key)是否存在。

猜你喜欢

转载自blog.csdn.net/qq_43310387/article/details/123963138
今日推荐