题目; https://leetcode-cn.com/problems/valid-parentheses/submissions/
思路一:
利用栈,因为队列应用于解决对称性问题
先计算字符串的长度,如果为奇数,就返回fasle,如果为偶数,则遍历字符串
从头开始遍历字符串,如果遍历到的字符是’(’,’{’,’[’,则入栈,如果遍历到的字符是‘)’,‘}’‘】’,则先判断栈是否为空,空就返回false,不为空就和栈顶元素相比较看是否匹配,同时将栈顶元素删掉,不匹配就返回false,匹配就继续循环
循环结束后,看栈是否为空,为空就返回true,不为空就返回false
class Solution {
stack stk;
public:
bool isValid(string s) {
/*
//利用栈
int len = s.size();
if (len % 2 == 1)
return false;
const char*ss = s.c_str();
char ch = ' ';
for (int i = 0; i < len; i++)
{
switch (s[i])
{
case '(':
case '{':
case '[':
stk.push(ss[i]);
break;
case ')':
if (stk.empty()) {
return false;
}
ch = stk.top();
stk.pop();
if (ch != '(')
return false;
break;
case '}':
if (stk.empty()) {
return false;
}
ch = stk.top();
stk.pop();
if (ch !='{')
return false;
break;
case ']':
if (stk.empty()) {
return false;
}
ch = stk.top();
stk.pop();
if (ch !='[')
return false;
break;
default:
return false;
break;
}
}
if (stk.empty())
return true;
else
return false;
};
思路二;同样利用栈
我们先来分析一下 这里有三种不匹配的情况,
第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
( [ { } ] ( )
第二种情况,括号没有多余,但是 括号的类型没有匹配上。
( 【 { } } }
第三种情况,字符串里右方向的括号多余了,所以不匹配。
( [ { } ] ) ) )
作者:carlsun-2
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/20-you-xiao-de-gua-hao-xiang-qing-chu-san-chong-qi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
计算字符串长度,遍历字符串,
如果遍历到的字符是‘(’,‘{’,‘【’则将‘)’‘}’,‘】’入栈
如果遍历到的是‘)’,‘}’,‘】’,则先判断栈是否为空,空就返回false,不为空就看字符和栈顶元素是否相等,相等就将栈顶元素删掉,继续下一次的循环,不相等就返回false
class Solution {
stack stk;
public:
bool isValid(string s) {
int count = s.size();
for (int i = 0; i < count; i++)
{
if (s[i] == ‘(’)
stk.push(’)’);
else if (s[i] == ‘{’)
stk.push(’}’);
else if (s[i] == ‘[’)
stk.push(’]’);
else if (s[i] == ‘)’ || s[i] == ‘}’ || s[i] == ‘]’)
{
if (stk.empty())
return false;
else if (s[i] == stk.top())
stk.pop();
else return false;
}
}
if (stk.empty())
return true;
else
return false;
}
};
思路三:利用哈希表,将符号映射为相应的键值,利用键值去检查匹配
class Solution {
stack stk;
public:
bool isValid(string s) {
unordered_map<char, int>m={ {’(’,1},{’{’,2},{’[’,3},{’)’,4},{’}’,5},{’]’,6} };
for (char ch : s) {
int flag = m[ch];
if (flag >= 1 && flag <= 3)
stk.push(ch);
else if (flag >3) {
if (stk.empty()) {
return false;
}
else {
if ((flag-3) != m[stk.top()])
{
return false;
}
else stk.pop();
}
}
}
if (stk.empty())
return true;
else
return false;