给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
题解:
如果只有一个种类的括号,只需要设置一个左括号的计数器即可。但是多个括号就不能这样求解了。
巧妙利用栈,遇到左括号则推入栈,遇到右括号则判断是否和栈顶的左括号相对应。如果不相对应,则不合法。因为不想对应的话,肯定有括号并没有匹配完,等于说嵌套了单个括号"( [ )"。
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isValid(string s) {
stack<char> save;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
save.push(s[i]);
else
{
if(save.empty())
return false;
else if(save.top() == '(' && s[i] != ')')
return false;
else if(save.top() == '[' && s[i] != ']')
return false;
else if(save.top() == '{' && s[i] != '}')
return false;
else
save.pop();
}
}
if(!save.empty())
return false;
return true;
}
};
int main()
{
Solution s;
string str;
while(cin >> str)
{
cout << s.isValid(str) << endl;
}
return 0;
}