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);
}
有錯誤歡迎指出,有問題歡迎諮詢。