力扣 题目20-- 有效的括号
题目
题解
方法1:删掉紧矮着的
比如{}{()} 先删成{()} ->{}->空 遍历没有()[]{}这三种情况时 判断一下是否为空即可
但是这样时间复杂度过高
方法2:栈
第一个右括号要与它之前的最后一个左括号匹配
第二个右括号要与它之前的倒数第二个左括号匹配
.....
所以我们创建一个栈 把左括号放进去 如果遍历到右括号 就和栈顶看是否匹配
如果 不匹配直接返回false 如果匹配就把出栈然后继续遍历
最后遍历结束看看 栈是否为空如果为空 则返回true 如果不为空则说明有左括号没有用完于是返回false
代码
方法1:删掉紧矮着的
#include<iostream> #include<string> using namespace std; class Solution { public: bool isValid(string s) { int correct = 1; //如果s长度小于2 直接返回false if (s.size() < 2) { return false; } //开始循环 while (correct) { //如果没有if情况就退出循环 correct = 0; //这里的循环防止重复符合 for (int i = 0; i < s.size(); i++) { //左边的判断是确保有( 后面的判断是确保 ( 后面就是 ) if (s.find("(", i) != -1 && s.find("(", i) + 1 == s.find(")", i)) { int left = s.find("(", i); s.erase(left, 2); correct = 1; break; } else if (s.find("[", i) != -1 && s.find("[", i) + 1 == s.find("]", i)) { int left = s.find("[", i); s.erase(left, 2); correct = 1; break; } else if (s.find("{", i) != -1 && s.find("{", i) + 1 == s.find("}", i)) { int left = s.find("{", i); s.erase(left, 2); correct = 1; break; } } } //看删除完后是否为空 if (s != "") { return false; } else { return true; } } }; int main() { Solution sol; string s = "){"; bool correct = sol.isValid(s); cout << correct << endl; }
方法2:栈
#include<iostream> #include<string> #include<stack> using namespace std; class Solution { public: bool isValid(string s) { string left = "([{"; string right = ")]}"; stack<char> leftstk; for (int i = 0; i < s.size(); i++) { if (int(left.find(s[i])) != -1) { leftstk.push(s[i]); } else { //如果左栈为空就匹配到了右括号 那么肯定无法匹配 返回false if (leftstk.empty() || left[int(right.find(s[i]))] != leftstk.top()) { return false; } else { leftstk.pop(); } } } if (leftstk.empty()) { return true; } else { return false; } } }; int main() { Solution sol; string s = ""; bool correct = sol.isValid(s); cout << correct << endl; }