题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
初步解法
用栈保存括号左侧,遇到括号右侧比较一下,最后再比较栈是否为空即可。
#include <string>
#include <stack>
using namespace std;
class Solution {
public:
bool isValid(string s) {
// 奇数长度的字符串肯定不符合要求
if (s.size() % 2 != 0)
{
return false;
}
stack<char> strStack = stack<char>();
int i = 0;
while (s[i] != '\0')
{
if (s[i] == '(' || s[i] == '{' || s[i] == '[')
{
strStack.push(s[i]);
}else{
// 堆中没有左符号就出现右符号的也不对
if (strStack.size() == 0)
{
return false;
}
if ((s[i] == ')' && strStack.top() == '(') || (s[i] == '}' && strStack.top() == '{') || (s[i] == ']' && strStack.top() == '['))
{
strStack.pop();
}else{
return false;
}
}
i++;
}
return strStack.size() == 0;
}
};
更有效率的写法
#include <string>
#include <stack>
using namespace std;
class Solution {
public:
bool isValid(string s) {
stack<char> str = stack<char>();
for(auto c : s)
{
if (c == '(' or c == '{' or c == '[') { str.push(c); }
else {
if(str.empty() or (str.top() == '(' and c != ')') or (str.top() == '{' and c != '}') or (str.top() == '[' and c != ']'))
{
return false;
}
str.pop();
}
}
return str.empty();
}
};
这样做的效率更高,初步推测是用了迭代器,所以就不用每次都判断是不是'\0'
,而且整体要判断的条件也少