携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
1.描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
- 1 <= s.length <= 10^4
- s 仅由括号 '()[]{}' 组成
2.分析
不管给的字符串包含多少括号,如果是正确的,那么最里层(我称为最小单位)一定是(),[],{}其中一个,且去除最小单位以后,剩下的最小单位仍然是:(),[],{}其中一个
解法:
(1)循环移除成对的括号:(),[],{}
(2)判断移除前后字符串有无变化,若已不再变化,说明已无:(),[],{}
(3)若剩下字符串为空,说明源输入S是标准括号的组合,若不为空,则S不标准,用return not ‘’即可得到答案
例: '[]' 移除(),[],{}后——> '(())' 再次移除——>() 再次移除——> '' ——> TRUE
'){' 移除(),[],{}后——> '){' 再次移除——> '){' 再次移除——> '[){]' ——> False
ps: 其实用栈效率更高,思路也是不断去除最小括号
3.AC代码
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (int i = 0; i < s.size(); i++){
switch(s[i])
{
case '(':
stk.push(')');
break;
case '{':
stk.push('}');
break;
case '[':
stk.push(']');
break;
case ')':
case ']':
case '}':
//judge stack empty
if (stk.empty()){
return false;
}
if (s[i] != stk.top()){
return false;
} else {
stk.pop();
}
default:
break;
}
}
if (!stk.empty())
return false;
return true;
}
};
4.总结
括号匹配是典型的栈应用问题。
参考
简单易懂Java/C++ /Python/js/go - 有效的括号 - 有效的括号 - 力扣(LeetCode).