精选力扣500题 第39题 LeetCode 20. 有效的括号c++/java详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第39题 LeetCode 20. 有效的括号c++/java详细题解相关的知识,希望对你有一定的参考价值。
1、题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
2、思路
(栈) O ( n ) O(n) O(n)
从前往后枚举每个字符:
-
1、当遇到
'('
,'{'
,'['
左括号时,将元素压进栈中 -
2、当遇到
')'
,']'
,'}'
右括号时,- 如果栈为空,
return false
- 如果不为空并且栈顶元素是对应的左括号,说明这是匹配的符号,将栈顶元素
pop
出即可, - 否则,表示不匹配,
return false
- 如果栈为空,
-
3、最后,若栈是空栈,表示所有字符都已经匹配好了,若不是空栈,表示还存在未能匹配好的子符
**注意:**由于'{'
和'}'
以及 '('
和')'
他们的字符数值只相差1
,而 '['
和']'
的字符数值只相差2
,因此还可以通过这个特性简化代码,代码在最下方。
3、c++代码
/*
1.遇到 '(','{','[' 入栈
2.遇到')',']','}',判断栈顶元素和当前元素是否匹配
若不匹配,直接返回 false
否匹配,让当前栈顶元素出栈
3.重复上述过程
*/
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '(' || s[i] == '[' || s[i] =='{') st.push(s[i]);
if(s[i] == ')')
{
if(!st.empty() && st.top() == '(') st.pop();
else return false;
}
if(s[i] == ']')
{
if(!st.empty() && st.top() == '[') st.pop();
else return false;
}
if(s[i] == '}')
{
if(!st.empty() && st.top() == '{') st.pop();
else return false;
}
}
return st.empty();
}
};
4、c++简化代码
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (auto c : s) {
if (c == '(' || c == '[' || c == '{') stk.push(c);
else {
if (stk.size() && abs(stk.top() - c) <= 2) stk.pop();
else return false;
}
}
return stk.empty();
}
};
5、java代码
class Solution {
public boolean isValid(String s) {
Stack<Character> st = new Stack<Character>();
for(int i = 0; i < s.length(); i++)
{
char t = s.charAt(i);
if(t == '(' || t == '[' || t =='{') st.add(t);
if(t == ')')
{
if(!st.isEmpty() && st.peek() == '(') st.pop();
else return false;
}
if(t == ']')
{
if(!st.isEmpty() && st.peek() == '[') st.pop();
else return false;
}
if(t == '}')
{
if(!st.isEmpty() && st.peek() == '{') st.pop();
else return false;
}
}
return st.isEmpty();
}
}
6、java简化代码
class Solution {
public boolean isValid(String s) {
Stack<Character> stk = new Stack<Character>();
for(int i = 0;i < s.length();i ++)
{
char t = s.charAt(i);
if(t == '(' || t == '{' || t == '[') stk.add(t);
else
{
if(!stk.isEmpty() && Math.abs(stk.peek() - t) <= 2) stk.pop();
else return false;
}
}
return stk.isEmpty();
}
}
原题链接:20. 有效的括号
以上是关于精选力扣500题 第39题 LeetCode 20. 有效的括号c++/java详细题解的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第41题 LeetCode 200. 岛屿数量c++/java详细题解
精选力扣500题 第59题 LeetCode 93. 复原 IP 地址c++/java详细题解
精选力扣500题 第13题 LeetCode 102. 二叉树的层序遍历c++详细题解
精选力扣500题 第49题 LeetCode 110. 平衡二叉树c++详细题解