開門見山,假設我們有一大串的由'{', '}', '[', ']', '(', ')' 這些括號構成比如像這樣的"{[}][()"符號串,我們肉眼當然能看出它是非法的,那么如何使用代碼來判斷是否合法呢?
其實我們可以借助棧來判斷這些符號串是否非法 :
1.首先我們我需要建立符號的一對一映射,如下所示:
1 map<char, char> mp = {{')', '('}, {'}', '{'}, {']', '['}}; // 映射括號
2.我們對字符串進行遍歷
1.如果能通過映射的鍵找到當前字符str[i],我們就從棧頂彈出一個元素並獲取該元素。當然,如果是棧為空的清空的話,我們就為這個字符隨便賦個值,比如說賦值為 '@',我們假記該變量為top_element。接下來我們看看是否能從當前字符str[i]映射所對應的值與top_element是否相同,若不同,則可以判斷該符號串為非法的。
2.若果找不到該字符str[i]映射的鍵,則先將其加入棧中。
3. 循環結束 ,若棧為空則表示當前字符串合法,若不為空,則表示當前字符串非法
4. 可能光用語言描述不能只管表達,下面我們來看圖示,假設我們輸入了"()"字符串,其具體過程如下:
5. 好了看完圖,接下來我們C++的代碼來描述一下該過程:
#include <iostream> #include <stack> #include <string> #include <map> using namespace std; class Solution { public: bool isValid(string s) { if (s == "") // 如果時空字符串也合法 return true; if (s.size() == 1) // 只有一個字符肯定非法 return false; stack<char> st; map<char, char> mp = {{')', '('}, {'}', '{'}, {']', '['}}; // 映射括號 for (int i = 0; i < s.size(); i++) { if (mp.find(s[i]) != mp.end()) // 查找mp是否映射了該符號 { char top_ele = (st.size() == 0) ? '#' : st.top(); // 獲取棧頂元素,若為空則隨便設置一個字符 if (top_ele != '#') // 棧不為空則彈出元素 st.pop(); if (top_ele != mp.find(s[i])->second) // 如果這個元素被彈出的元素和mp對應映射的值不一樣,則直接返回false return false; } else { st.push(s[i]); //壓入棧中 } } return st.size() == 0; // 如果棧為空則表示合法 } };
6. 注意代碼中map是直接用list初始化的,所以這段代碼必須在c++11下上的版本中才可以運行。
好了以上就是這次分享的全部內容了,如有錯誤還望斧正,我們下次見。