Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
示例 4:
输入:s = "([)]" 输出:false
示例 5:
输入:s = "{[]}" 输出:true
提示:
- 1 <= s.length <= 104
- s 仅由括号 '()[]{}' 组成
思路
根据题意发现这是一道字符串的匹配问题,面对这种问题我们可以借助栈的先进后出的性质进行解决。遍历字符串s,由于后遇到的左括号要先闭合,所以我们将这个左括号放入栈中,使其成为栈顶元素;当遇到一个右括号时,我们取出栈顶元素进行匹配,如果栈为空或者括号不能够进行匹配,我们就返回结果false。
为了快速判断括号的类型,我们可以使用c++的stl哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。这样做事半功倍。
代码
class Solution {
public:
bool isValid(string s) {
// 如果字符串长度为奇数,直接返回
int length = s.size();
if(length % 2 != 0) return false;
// 对hashmap进行初始化,哈希表的键为右括号,值为相同类型的左括号
unordered_map<char, char> hashmap = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> ch;
for(int i = 0;i < length;i ++)
{
if(hashmap.count(s[i])){
// 开始进行比较
// cout << ch.top();
// 判断栈是否为空,括号类型能否匹配
if(ch.empty() || ch.top() != hashmap[s[i]]) return false;
ch.pop();
}else{
ch.push(s[i]);
}
}
// cout << ch.size() << endl;
// 如果栈中元素为空,代表全部括号匹配完毕
return ch.empty();
}
};