题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
测试用例
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:fals
第一次提交:
class Solution {
public:
bool isValid(string s)
{
stack<char> st;
int len=s.length();
for(int i=0;i<len;i++)
{
if(!st.empty())
{
if(st.top()=='(' && s[i]==')')
st.pop();
else if(st.top()=='['&&s[i]==']')
st.pop();
else if(st.top()=='{'&&s[i]=='}')
st.pop();
}
st.push(s[i]);
}
if(st.empty())
return true;
else
return false;
}
};
算法思路:
最每个字符串都进行遍历,只有当栈的最顶端是左括号,当前遍历的字符是右括号,而且正好是一对时,出栈,剩下其他的情况都入栈,如果最后一个字符也遍历完,但是栈不为空,证明有括号没有被匹配,则字符串无效,反之栈空,则有效。
修改:
修改1:
关于continue,和break
continue:只是跳出当前 i 的循环,continue后紧接着进行 i+1的循环
break:彻底跳出循环,之后的 i 都不运行了
修改2:
如上的代码是不对的,以第一个示例为例,遇到第一个字符,左括号,push进去,遇到第二个字符,右括号时,栈内出栈,但同时这个字符也被push进去了,栈内就只留下了一个右括号,最后结果栈不为空,不是有效的括号,判断错误。
关键是有既弹栈又入栈的操作,遍历每一个字符,弹栈还是入栈只能进行一个。
修改3:最后根据栈空输出true和false的方法可以简化,因为st.empty()的值就是true或者false,可以直接使用。
修改后的提交:
class Solution {
public:
bool isValid(string s)
{
stack<char> st;
int len=s.length();
for(int i=0;i<len;i++)
{
if(!st.empty())
{
if(st.top()=='(' && s[i]==')')
{
st.pop();
continue;
}
else if(st.top()=='['&&s[i]==']')
{
st.pop();
continue;
}
else if(st.top()=='{'&&s[i]=='}')
{
st.pop();
continue;
}
}
st.push(s[i]);
}
return st.empty();
}
};