?今日份題目
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判斷字符串是否有效。
有效字符串需滿足:
-
左括號必須用相同類型的右括號閉合。
-
左括號必須以正確的順序閉合。
-
每個右括號都有一個對應的相同類型的左括號。
示例1
輸入:s = "()" 輸出:true
示例2
輸入:s = "()[]{}" 輸出:true
示例3
輸入:s = "(]" 輸出:false
提示
-
1 <= s.length <= 104
-
s
僅由括號'()[]{}'
組成
?題目思路
這里還是提取一下題目的特征點:
-
閉合
-
按順序
-
每個左(右)對應一個右(左)
先考慮明面上的錯誤情況:
-
只有左(右)
-
左右不對應
解題思路是使用棧,棧的特點是先進后出,完全符合該模式。?基本過程是:當我們遇到左括號時,將其壓入棧;遇到右括號時,從棧中取出一個符號看是否配對就好。
深入來看,還要考慮括號嵌套問題,不需要擔心當前右括號需要跨越幾個正常的括號組才能找到左括號的問題,如 " { [ ] ) " ,因為,正常的括號組一定早已經經歷了配對,所以每次只需要判斷棧頂的是否是對應的左括號就好。
該題目是棧相關的簡單、經典題目,初學的同學們可以多看幾遍,多做幾次。
?stack補充知識
這里再簡單補充一下STL中stack的使用方法。
棧是先進后出,后進先出的數據結構,使用方法主要包括:
//聲明
stack<int> s;
//指定底層容器的棧
stack<int,vector<int> > s;
//入棧
s.push(1);
//訪問棧頂
s.top();
//從棧頂清除一個元素(只能從棧頂清除)
s.pop();
//判斷棧中是否還有元素
s.empty();//無元素的話,empty函數會返回true
//判斷棧的元素數量
s.size();
?
//清空棧中的元素
for(int i=s.size();i;i--) s.pop();
?代碼
class Solution
{
public:bool isValid(string s) {stack<char> p;for(int i=0;i<s.size();i++){if(s[i]=='('||s[i]=='['||s[i]=='{') p.push(s[i]);else if(s[i]==')'){if(p.empty()) return false;char cur=p.top();p.pop();if(cur!='(') return false; }else if(s[i]==']'){if(p.empty()) return false;char cur=p.top();p.pop();if(cur!='[') return false; }else if(s[i]=='}'){if(p.empty()) return false;char cur=p.top();p.pop();if(cur!='{') return false; }}if(!p.empty()) return false;return true;}
};
提交結果
我的代碼的內存消耗還有待改進,歡迎大家提供更高效的代碼,如果過后有更優化的思路我還會繼續更新的,大家評論區見!
點贊收藏不迷路?~