給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需知足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true
看到這題的第一反應就是,正常來講,正確的括號的話,那麼必須是一一對應的,那若是左括號爲1,右括號爲-1的話,那麼和爲0。從這個想法出發,個人解法以下。python
class Solution: def isValid(self, s: str) -> bool: d = {'(' : 1, ')' : -1, '[' : 2, ']' : -2, '{' : 3, '}' : -3} changeNumList = [d[c] for c in s] if 0 != sum(changeNumList): return False tempList = list() for i in changeNumList: if i > 0: tempList.append(i) else: if len(tempList) > 0: if (tempList[-1] + i) != 0: return False else: tempList.pop() if len(tempList) > 0: return False return True
執行用時 :48 ms, 在全部 Python3 提交中擊敗了80.77%的用戶,內存消耗 :13.8 MB, 在全部 Python3 提交中擊敗了5.51%的用戶c++
#include<map> #include<vector> class Solution { public: bool isValid(string s) { std::map<char, int> changeNumMap = {{'(', 1}, {')', -1}, {'[', 2}, {']', -2}, {'{', 3}, {'}', -3}}; std::vector<int> numList; int sum = 0; for(int i = 0; s[i] != '\0'; ++i) { numList.push_back(changeNumMap[s[i]]); sum += numList[i]; } if(sum != 0) return false; std::vector<int> tempNumList; for(auto it = numList.begin(); it != numList.end(); ++it) { if((*it) > 0) { tempNumList.push_back((*it)); } else { if(tempNumList.size() > 0) { if((tempNumList.back() + (*it)) != 0) { return false; } else { tempNumList.pop_back(); } } } } if(tempNumList.size() > 0) return false; return true; } };
執行用時 :4 ms, 在全部 C++ 提交中擊敗了79.60%的用戶,內存消耗 :8.7 MB, 在全部 C++ 提交中擊敗了66.25%的用戶數組