一、题目:
20.有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例1:
示例2:
示例3:
二、思路:
思路1:
字符串从左向右遍历,若每一个'(', '[', '{' 都有一个中间相隔了偶数个字符的 ')', ']', '}'与之对应 ,则该字符串为有效字符串。
字符串遍历采用下标,一共有三个字符'(', '[', '{' ,可采用switch结构,在case里加上对应字符判断,采用一个新的变量k计
数,判断为真则++k并退出。最后比较k是否为s.size()/2。
思路2:
采用一个栈存放字符,如果放入字符为‘)’‘】’‘}’且对应栈顶元素为‘(’‘【’‘{’则将栈顶元素退栈,否则执行进栈操作。最后若栈为空,则返回true;若不空,返回false。
三、代码(C++):
思路1:
bool isValid(string s) {
if(s.size()%2==1) //排除特殊情况
return false;
int k=0;
for(int i=0;i<s.size();i++) //遍历数组
{
switch(s[i]){ //switch结构
case'(':
for(int j=i+1;j<s.size();j+=2) //依次判断
{
if(s[j]==')')
{
++k;
break;
}
}
break;
case'[':
for(int j=i+1;j<s.size();j+=2)
{
if(s[j]==']')
{
++k;
break;
}
}
break;
case'{':
for(int j=i+1;j<s.size();j+=2)
{
if(s[j]=='}')
{
++k;
break;
}
}
break;
}
}
if(k==s.size()/2) //比较k是否为s.size()/2
return true;
else
return false;
}
思路2:
bool isValid(string s) {
stack<char> brackets;
for(int i=0;i!=s.size();i++)
{
if(brackets.empty())
{
brackets.push(s[i]);
continue;
}
if(s[i]==')'&&brackets.top()=='(')
brackets.pop();
else if(s[i]==']'&&brackets.top()=='[')
brackets.pop();
else if(s[i]=='}'&&brackets.top()=='{')
brackets.pop();
else
brackets.push(s[i]);
}
if(brackets.empty())
return true;
else
return false;
}