目录
问题描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
实现代码:
class Solution {
public:
bool isValid(string s)
{
if(s.size()%2!=0)
{
return false;//若字符串不为奇数,一定不满足条件
}
stack<char> st;
for(int i=0;i<s.size();i++)
{
//每次遇到左括号,将其对应的右括号入栈
if(s[i]=='(') st.push(')');
else if(s[i]=='{') st.push('}');
else if(s[i]=='[') st.push(']');
//每次遇到右括号,判断与栈顶元素是否,相同则出栈顶元素,反之直接返回false,不符合要求
else if(st.empty()||st.top()!=s[i]) return false;
else
{
st.pop();
}
}
return st.empty();
}
};
原理思路:
简单题,很明显要用到栈,如果字符串长度不能被2整除,明显直接就可以判断此字符串不符合条件,返回false,定义一个栈,循环遍历字符串,若遇到左括号就将其对应的右括号入栈,若遇到右括号,就判断栈是否为空和与栈顶字符是否相同,栈为空或与栈顶字符不同,则直接返回false,若相同,我们就将栈顶字符出栈,有点像消消乐的感觉,不过这里是有顺序的消除。