LeetCode刷題 20 有效的括號

題目

給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需知足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true

思考

看到這題的第一反應就是,正常來講,正確的括號的話,那麼必須是一一對應的,那若是左括號爲1,右括號爲-1的話,那麼和爲0。從這個想法出發,個人解法以下。python

解題思路

  1. 先創建括號的對應值的字典,左爲正,右爲負。
  2. 將得到的括號字符串轉換成數字數組
  3. 先求sum,不爲零就說明不是有效括號,返回
  4. 遍歷數字數組,若是獲得是正數,就push到新數字數組的最後
  5. 若是是負數就判斷,這個負數跟新數字數組的最後一位相加是否爲零,是的話pop新數組最後一位
  6. 若是相加不爲零則說明括號沒有一一對應,返回

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++

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%的用戶數組

相關文章
相關標籤/搜索