Valid Parentheses (java 思路)

思路:1.檢查String大小,若爲1和0肯定不匹配;2.利用棧的原理進行對比,‘{’'(' '['三個符號放入棧,右側符號來進行對比。

注意:我的第一個程序在“run code”裏面是能成功運行的不過在提交後結果錯誤,查了下是因爲我使用了全局變量,而leetcode本身不支持。

class Solution {
    private boolean flag = true;
    public boolean isValid(String s) {
        //首先判斷字符串尺寸,如果爲空或者1則不可能匹配
        if(s.length() < 2) flag = false;
        else{
            Stack<Character> x = new Stack<Character>();
            for(int i = 0; i < s.length(); i++){
                //判斷,如果爲左側符號,壓入棧中(先進後出)
                //檢查字符用“==”,檢查String用“isEqual()”
                if(s.charAt(i) == '{' || s.charAt(i) == '[' || s.charAt(i) == '(')
                    x.push(s.charAt(i));
                else{
                    //判斷如果不是則側符號,此時棧中無符號,肯定爲false
                    if(x.size() == 0){
                        flag = false;
                    }
                    //pop函數可以調用並移除棧頂層的字符
                    char top = x.pop();
                    //判斷符號和棧中頂層符號是否匹配
                    if(s.charAt(i) == '}')
                        if(top != '{'){
                            flag = false;
                            break;
                        }
                    else if(s.charAt(i) == ']')
                        if(top != '['){
                            flag = false;
                            break;
                        }
                    else if(s.charAt(i) == ')')
                        if(top != '('){
                            flag = false;
                            break;
                        }
                }
            }
            //還需要檢查棧中有無剩餘字符,若有剩餘,代表不匹配
            if(x.size() != 0)
                flag = false;
        }
        return flag;
    }
}

其實下面這段代碼應該是對的,可是用到了多個return,就總是會被誤判爲錯的。

class Solution {
    public boolean isValid(String s) {
        Stack<Character> x = new Stack<Character>();
        for(int i = 0; i < s.length(); i++){
            //判斷,如果爲左側符號,壓入棧中(先進後出)
            //檢查字符用“==”,檢查String用“isEqual()”
            if(s.charAt(i) == '{' || s.charAt(i) == '[' || s.charAt(i) == '(')
                x.push(s.charAt(i));
            else{
                //判斷如果不是zuo側符號,此時棧中無符號,肯定爲false
                if(x.size() == 0){
                    return false;
                }
                //pop函數可以調用並移除棧頂層的字符
                char top = x.pop();
                //判斷符號和棧中頂層符號是否匹配
                if(s.charAt(i) == '}')
                    if(top != '{')
                        return false;
                else if(s.charAt(i) == ']')
                    if(top != '[')
                        return false;
                else if(s.charAt(i) == ')')
                    if(top != '(')
                        return false;
            }
        }
        //還需要檢查棧中有無剩餘字符,若有剩餘,代表不匹配
        return x.size() == 0;
   
    }
}

所以打算縮減爲一個return,而又不能設置全局變量存儲bool值。

下面其實是參考人家別人的一段代碼,通過向棧內壓入反向字符,減少了代碼和return數,就成功了

class Solution {
    public boolean isValid(String s) {
        Stack<Character> x = new Stack<Character>();
        for(int i = 0; i < s.length(); i++){
            //判斷,如果爲左側符號,壓入棧中(先進後出)
            //檢查字符用“==”,檢查String用“isEqual()”
            if(s.charAt(i) == '{')
                x.push('}');
            else if(s.charAt(i) == '[')
                x.push(']');
            else if(s.charAt(i) == '(')
                x.push(')');
            else if(x.size() == 0 || x.pop() != s.charAt(i))
                return false;
        }
        return x.size() ==0;
   
    }
}


發佈了39 篇原創文章 · 獲贊 22 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章