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

题目描述

应该是bili最近的一道面试题,涉及栈等相关知识


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

有效字符串需满足:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


我的解答

72/91部分通过,剩下的没思路了,留下弱者的眼泪…

只能判断 对称 的情况([{}]),对于 () {} []情况通不过

开始是想用栈的,但是思路不是很清晰,题解用的栈

  • 代码
class Solution {
    public boolean isValid(String s) {
        if(s.length() == 0){
            return true;
        }
        char[] chArr = s.toCharArray();
        int length = chArr.length;
        if(length % 2 != 0){
            return false;
        }
        else{
            int start = 0;
            int end = length - 1;
            while(start < end){
                if(!judge(chArr[start],chArr[end])){
                    return false;
                }
                else{
                    start ++;
                    end --;
                }
            }
            return true;
        }

    }
    public boolean judge(char c1,char c2){
        if(c1 == '(' && c2 == ')')
            return true;
        else if(c1 == '{' && c2 == '}')
            return true;
        else if(c1 == '[' && c2 == ']')
            return true;
        else
            return false;
    }
}

题解



  • 思想

遇到 括号的 左半部分,就将 对应的 右半部分 进栈

遇到 括号的 右半部分,就和 栈顶的元素 比较,因为后出现的 括号左半部分 对应 较晚 进栈 的右半部分括号

通俗理解,就是 晚出现的 左半部分,需要 对应的 右半部分 在栈顶,就是晚进栈 的在栈顶

当出现 右半部分 的括号,需要和栈顶 元素比较,对于比较不相等的 ,一定不是 正确的情况

如果最后 全部遍历结束,栈刚好为空,则证明出现的的 右半部分 都是和 栈顶元素是匹配的。

  • 解答1
class Solution {
    public boolean isValid(String s) {
        LinkedList<Character> stack = new LinkedList<>();
        for (char c : s.toCharArray()) {
            if (c == '[') stack.push(']');
            else if (c == '(') stack.push(')');
            else if (c == '{') stack.push('}');
            else if (stack.isEmpty() || c != stack.pop()) return false;
        }
        return stack.isEmpty();
    }
}
  • 字符串的替换解决2

不过太慢,之前可以现在应该时间超时了

class Solution {
    public boolean isValid(String s) {
        if(s.length() == 0){
            return true;
        }
        if(s.length() % 2 != 0){
            return false;
        }
       while(s.contains("()") || s.contains("{}") || s.contains("[]")){
           if(s.contains("()")) s.replace("()","");
           if(s.contains("{}")) s.replace("{}","");
           if(s.contains("[]")) s.replace("[]","");

       }
       return s.length() == 0;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

scl、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值