LeetCode筆記:20. Valid Parentheses

問題:

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.

大意:

給出一個只包含 '(', ')', '{', '}', '[' 和 ']' 的字符串荐糜,判斷它的輸入是否是有效的。
括號必須是以正確的順序關閉的疲陕, "()" 和 "()[]{}" 都是有效的郑叠,但是 "(]" 和 "([)]" 是無效的胚宦。

思路:

題目的要求說來也簡單,就是判斷括號是不是有效的瘾带,自己先用測試用例試了一下沟堡,括號中包含括號也是有效的。

其實無效的情況也就幾種介评,左括號匹配到了不一樣的右括號库北、左括號多了、右括號多了们陆,我用一個數(shù)組記錄不同位置出現(xiàn)的括號的種類寒瓦,出現(xiàn)新的右括號的時候判斷是否匹配到了正確的括號,還要看是不是是多了的右括號坪仇,最后看有沒有多出來的左括號杂腰。方法很笨,代碼也寫的很冗余椅文,不過速度還可以喂很。

代碼(Java):

public class Solution {
    public boolean isValid(String s) {
        int[] markArr = new int[s.length()];// 1表示(),2表示[]皆刺,3表示{}
        
        char[] arr = s.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == '(') {
                markArr[i] = 1;
            } else if (arr[i] == ')') {
                boolean hasMatched = false;
                for (int j = i-1; j >= 0; j--) {
                    if (markArr[j] > 0 && markArr[j] != 1) return false;
                    else if (markArr[j] == 1) {
                        markArr[j] = 0;
                        hasMatched = true;
                        break;
                    }
                }
                if (!hasMatched) return false;
            } else if (arr[i] == '[') {
                markArr[i] = 2;
            } else if (arr[i] == ']') {
                boolean hasMatched = false;
                for (int j = i-1; j >= 0; j--) {
                    if (markArr[j] > 0 && markArr[j] != 2) return false;
                    else if (markArr[j] == 2) {
                        markArr[j] = 0;
                        hasMatched = true;
                        break;
                    }
                }
                if (!hasMatched) return false;
            } else if (arr[i] == '{') {
                markArr[i] = 3;
            } else if (arr[i] == '}') {
                boolean hasMatched = false;
                for (int j = i-1; j >= 0; j--) {
                    if (markArr[j] > 0 && markArr[j] != 3) return false;
                    else if (markArr[j] == 3) {
                        markArr[j] = 0;
                        hasMatched = true;
                        break;
                    }
                }
                if (!hasMatched) return false;
            }
        }
        
        for (int i = 0; i < markArr.length; i++) {
            if (markArr[i] > 0) return false;
        }
        return true;
    }
}

他山之石:

public class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        // Iterate through string until empty
        for(int i = 0; i<s.length(); i++) {
            // Push any open parentheses onto stack
            if(s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{')
                stack.push(s.charAt(i));
            // Check stack for corresponding closing parentheses, false if not valid
            else if(s.charAt(i) == ')' && !stack.empty() && stack.peek() == '(')
                stack.pop();
            else if(s.charAt(i) == ']' && !stack.empty() && stack.peek() == '[')
                stack.pop();
            else if(s.charAt(i) == '}' && !stack.empty() && stack.peek() == '{')
                stack.pop();
            else
                return false;
        }
        // return true if no open parentheses left in stack
        return stack.empty();
    }
}

這個做法用到了Stack棧這個類型少辣,確實這道題很適合用棧來做,先進后出羡蛾,遇到左括號的時候放進去漓帅,遇到右括號的時候從棧頂拿括號進行匹配,匹配失敗就錯了林说,全部匹配正確而且最后棧里沒東西了就對了煎殷。代碼簡潔多了。

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首頁

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末腿箩,一起剝皮案震驚了整個濱河市豪直,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珠移,老刑警劉巖弓乙,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钧惧,居然都是意外死亡暇韧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門浓瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懈玻,“玉大人,你說我怎么就攤上這事乾颁⊥课冢” “怎么了艺栈?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長湾盒。 經常有香客問我湿右,道長,這世上最難降的妖魔是什么罚勾? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任毅人,我火速辦了婚禮,結果婚禮上尖殃,老公的妹妹穿的比我還像新娘丈莺。我一直安慰自己,他們只是感情好送丰,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布场刑。 她就那樣靜靜地躺著,像睡著了一般蚪战。 火紅的嫁衣襯著肌膚如雪牵现。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天邀桑,我揣著相機與錄音瞎疼,去河邊找鬼。 笑死壁畸,一個胖子當著我的面吹牛贼急,可吹牛的內容都是我干的。 我是一名探鬼主播捏萍,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼太抓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了令杈?” 一聲冷哼從身側響起走敌,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逗噩,沒想到半個月后掉丽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡异雁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年捶障,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纲刀。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡项炼,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情锭部,我是刑警寧澤驱闷,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站空免,受9級特大地震影響,放射性物質發(fā)生泄漏盆耽。R本人自食惡果不足惜蹋砚,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摄杂。 院中可真熱鬧坝咐,春花似錦、人聲如沸析恢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽映挂。三九已至泽篮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柑船,已是汗流浹背帽撑。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鞍时,地道東北人亏拉。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像逆巍,于是被迫代替她去往敵國和親及塘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內容