题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/2021-spring-recruitment/9ht621/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目分析
通过题目描述可以看出,最能体现括号特点的是括号嵌套的时候。在多个括号嵌套的时候最后进去的左括号要最先由右括号闭合。因为有这种最后进入的要最先出来的特点,要使用“栈”结构作为主结构。
括号应该如何推入栈中?因为正常情况下总是’(‘先出现,因此将’('当作入栈的元素。
从栈中pop出来时应该如何与’)'匹配?用hashmap或function将左括号与右括号做匹配。
解决
目前此题目的数据结构决定为 stack 和 hashmap,主要流程为
bool isValid(string s)
{
stack<char> stk;
/*
hashmap 为左括号和右括号做配对
*/
unordered_map<char> leftRMap;
leftRMap['('] = ')';
leftRMap['{'] = '}';
leftRMap['['] = ']';
/*遍历整个字符串*/
for(int index=0; index < s.size();index++)
{
char curChar = s[index];
/*
如果当前为左括号
*/
if(curChar == '(' || curChar == '[' || curChar == '{')
{
/*将左括号匹配的右括号push到stack里*/
stk.push(leftRMap[curChar]);
}
else
{
/*遇到右括号时pop出最上面的内容,并于右括号匹配。因为之前push的内容都已转化为右括号,因此直接匹配是否一致就可*/
if(stk.empty() || stk.top() != curChar)
{
return false;
}
stk.pop();
}
}
}
需要注意
边界条件
有2种cases需要特别地解决:
- 当string全是“(” or “)” 多出时的处理
当string全是 “((” 时,因为没有 “)” 所以stack里的值删除不了,因此在string都遍历完毕后 stack里有值的一定是 “(” 多出来了。
return stk.empty();
当string中 “)” 多出来时,stack里面一定是空的()
if(charStack.empty() || charStack.top() != s[i])
上述代码的charStack.empty()解决了这个问题