题目

题解
方法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;
}