0
点赞
收藏
分享

微信扫一扫

CodeTop018 有效的括号

一叶轻舟okok 2022-02-24 阅读 51

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

  • 左括号必须用相同类型的右括号闭合
  • 左括号必须以正确的顺序闭合
    典型的使用栈来解决的题目,真的也没什么可说的,用方式一做了一下,但是不够巧妙.

所以又在题解里找到了更好的方式,同样是利用栈,但是方法更高效.具体的思路是:

  • 如果遇到’(’,’[’,’{'就入栈,否则的话:(说明当前的符号是一个右括号)
  • >如果此时栈为空(但是当前还没遍历完,这就说明有一个右括号要进到栈底去),直接返回false
  • >如果当前是’)‘但是出栈的这个字符不是’(’,那也可以直接返回false了
  • >如果当前是’]‘但是出栈的这个字符不是’[’,那也可以直接返回false了
  • >如果当前是’}‘但是出栈的这个字符不是’{’,那也可以直接返回false了
  • 最终返回栈是否为空即可

一个变形的题:左括号必须以正确的顺序闭合,这个条件去掉如何实现?
这个就更简单了,说明不用完全按照(){}[]这样的规则闭合,那直接统计数量然后做加减操作,最后判断是否计数为0即可

public class Solution018 {
    public static void main(String[] args) {
        String s = "()[]{}";
        System.out.println(isValid2(s));
    }

    //方法一 同样是利用栈 但是不够高效
    public static boolean isValid(String s) {
         Stack<Character> stack = new Stack<>();
         for(int i=0;i<s.length();i++){
             if(stack.isEmpty()){
                 stack.push(s.charAt(i));
             }else{
                 if(s.charAt(i)==')' && stack.peek()=='('){
                     stack.pop();
                 }else if(s.charAt(i)==']' && stack.peek()=='['){
                     stack.pop();
                 }else if(s.charAt(i)=='}' && stack.peek()=='{'){
                     stack.pop();
                 }else{
                     stack.push(s.charAt(i));
                 }
             }
         }

         return stack.isEmpty();
     }

     //方法二
    public static boolean isValid2(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(c=='(' || c=='[' || c=='{'){//如果遇到'(','[','{'就入栈
                stack.push(c);
            }else if(stack.isEmpty() || c==')'&&stack.pop()!='(' || c==']'&&stack.pop()!='[' || c=='}'&&stack.pop()!='{'){
                return false;
            }
        }
        return stack.isEmpty();
    }

    //左括号必须以正确的顺序闭合,这个条件去掉的实现方式
    public static boolean isValid3(String s){
        int n1 = 0,n2 = 0,n3 = 0;
        for (int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if (ch=='(') n1++;
            else if (ch=='[') n2++;
            else if (ch=='{') n3++;
            else if (ch==')') n1--;
            else if (ch==']') n2--;
            else n3--;
        }
        return !(n1!=0 || n2!=0 || n3!=0);//这要有一个不为0 就是false
    }
}
举报

相关推荐

0 条评论