力扣第二十題 20 有效的括號

20.有效的括號
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。

有效字符串需滿足:

左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。

示例 1:

輸入: “()”
輸出: true
示例 2:

輸入: “()[]{}”
輸出: true
示例 3:

輸入: “(]”
輸出: false
示例 4:

輸入: “([)]”
輸出: false
示例 5:

輸入: “{[]}”
輸出: true

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

這個題我最開始是沒打算用棧的,一開始就就打算把一些特殊情況解決了,比如括號數爲奇數,左括號數 != 右括號數,這兩種情況直接 return false ,還有就是字符串爲空的和字符個數爲一的直接 return true,接下來就是解決一般情況,但是最後我沒解決,感覺好複雜,這思路簡單,先特殊,後一般,但是最後解決起來感覺很困難,代碼量很大。

後來我在網上了參考了一些老哥的解題思路和答案,挖槽,用棧啊,我第一時間 沒想到用棧,那肯定是代碼碼少了,頭髮掉少了。

上代碼

bool isValid(char * s){
    if (s == NULL || s[0] == '\0') 
        return true;
    char *stack = (char*)malloc(strlen(s)+1); 
    int top = 0;
    for(int i = 0 ; s[i] != '\0' ; i++){
    	//入棧的只有右括號,無論棧裏面有多少右括號,棧頂都是最裏的右括號
        if(s[i] == '('||s[i] == '['||s[i] == '{'){
        	//數組是從0開始的,但是棧是從1開始的,所以是++top
            stack[++top] = s[i];
        }
        //'('與')'的ASCII碼相差1,'['與']' 和'}'與'}'相差2
        //匹配成功棧頂的右括號就會出棧,棧頂指針指向上一層括號
        else if(s[i] == stack[top] + 1 || s[i] == stack[top] + 2){
            --top;
        }
        //當可以執行到這裏時,那就說明s[i]一定爲左括號,而且前面沒有能夠匹配的右括號
        else{
        	//這裏不加free,在某些情況下會導致內存泄漏
            free(stack);
            return false;
        }
    }
    free(stack);
    //當棧元素全部出棧,說明沒有多餘的括號,全部匹配成功 !top = 1;true;
    //當棧元素還有些沒有出棧,說明有多餘的括號 !top = 0;false;
    return(!top);
}

有錯誤歡迎指出,有問題歡迎諮詢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章