1. 程式人生 > 其它 >20.有效的括號

20.有效的括號

技術標籤:leetcode刷題_javajava

題目20:給定一個只包括 '(',')','{','}','[',']' 的字串 s ,判斷字串是否有效。
有效字串需滿足:
1.左括號必須用相同型別的右括號閉合。
2.左括號必須以正確的順序閉合
/*可以學到的知識點:*/
char ch=s.charAt(i); //獲取一個字串中的單個字母
map.containsKey(ch); //判斷map集合中是否有鍵值為ch的鍵

三種解法:
第一種:
最笨的一種方法:依次獲取到每一個字母,如果是左括號就直接壓入棧,如果是右括號且棧不為空就分別判斷棧頂的的元素是不是對應的左括號。最終如果棧是空的,則配對成功,否則失敗。

		Stack<Character> stack=new Stack();
        for(int i=0;i<s.length();i++){
            char character=s.charAt(i);
            if(character=='('||character=='{'||character=='['){
                stack.push(character);
            }
            if(character==')'){
                if(!stack.
isEmpty()){ char popChar=stack.pop(); if(popChar!='('){ return false; } }else{ return false; } } if(character=='}'){ if(!stack.
isEmpty()){ char popChar=stack.pop(); if(popChar!='{'){ return false; } }else{ return false; } } if(character==']'){ if(!stack.isEmpty()){ char popChar=stack.pop(); if(popChar!='['){ return false; } }else{ return false; } } } if(stack.isEmpty()){ return true; } return false; }

第二種:比較巧妙的一種,但是時空複雜度都很高

    while(s.contains("()")||s.contains("{}")||s.contains("[]")){
        if(s.contains("()")){
            s=s.replace("()","");
        }
        if(s.contains("{}")){
            s=s.replace("{}","");
        }
        if(s.contains("[]")){
            s=s.replace("[]","");
        }
    }
    return s.length()==0;

第三種:官方答案的解法:利用map集合去儲存一對兒一對兒的括號

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