題目描述:
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
分析:
利用棧的性質,先進後出,遇到左括號則壓入棧,遇到右括號則與棧頂元素匹配,若匹配成功則將棧頂元素彈出,反之返回false。
- 首先判斷字符串的長度,如果是奇數,則返回錯誤;
- 創建一個哈希表,目的是利用哈希表的鍵-值匹配;
- 創建一個棧,將左括號存入到棧中;
- 遍歷到右括號,則與棧中的左括號相匹配,判斷兩者是否相匹配,如果匹配的話,則將棧中的括號彈出;
完整代碼:
class Solution {
public:
bool isValid(string s) {
//聲明一個變量,表示字符串的長度
int length = s.length();
//檢查輸入的合法性
//注意空字符串是有效的字符串
if(length % 2 != 0)
return false;
//創建一個哈希表
map<char, char> hash;
hash.insert(map<char, char>::value_type(')','('));
hash.insert(map<char, char>::value_type(']','['));
hash.insert(map<char, char>::value_type('}','{'));
//創建一個棧,用來存放左括號
stack<char> array;
//遍歷整個字符串
for(int i = 0; i < length; ++i)
{
//如果遍歷到的括號是左括號
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
array.push(s[i]);
//如果遍歷到的是右括號
else if(s[i] == ')' || s[i] == ']' || s[i] == '}')
{
//判斷棧是否爲空
if(array.empty())
return false;
//判斷當前的字符是否與棧頂元素相匹配
if(hash[s[i]] == array.top())
{
array.pop();
continue;
}
else
return false;
}
}
//如果當前的棧爲空,則說明括號有效
if(array.empty())
return true;
else
return false;
}
};