括号匹配(leetcode20)
简单的括号匹配问题。
思路
自己的思路
每次寻找最右的左括号,然后与与之相邻最近的没有被使用过的括号进行匹配 。
复杂度O(n^2)
答案思路
左括号入栈,右括号出站进行匹配。
复杂度O(n)
错误和优化:
1.忽略“([)]”这种情况。
2.忽略只有一个左括号的情况应判断该括号未被使用。
3.优化:如果字符串个数为奇数,返回错误。子串为空串返回0。
4.优化:用string而不是stack。操作方法为push_back(),back(),pop_back();
代码
自己
#include <vector>
#include <cstdio>
class Solution {
vector<int>use;
public:
bool match(char a,char b)
{
if(a == '(' && b == ')')return true;
if(a == '{' && b == '}')return true;
if(a == '[' && b == ']')return true;
return false;
}
bool isValid(string s) {
int n = s.size();
bool flag = false;
use.clear();
for(int i = 0; i < n; i ++)
{
use.push_back(0);
}
for(int i = n - 1; i >=0; i --)
{
if(s[i] !='(' && s[i] != '[' && s[i] != '{')continue;
for(int j = i + 1; j < n; j ++)
{
if(use[j])continue;
if(match(s[i],s[j]))
{
use[i] = 1;
use[j] = 1;
break;
}
else return false;
}
}
for(int i = 0; i < n; i ++)
{
if(!use[i])return false;
}
return true;
}
};
看答案后
#include <stack>
class Solution {
stack<char>st;
public:
bool match(char a,char b)
{
if(a == '(' && b == ')')return true;
if(a == '{' && b == '}')return true;
if(a == '[' && b == ']')return true;
return false;
}
bool isValid(string s) {
int n = s.size();
char left;
for(int i = 0; i < n; i ++){
if(s[i] == '(' || s[i] == '{' || s[i] == '[')
{
st.push(s[i]);
}
else
{
if(st.size() == 0)return false;
left = st.top();
if(match(left,s[i])){
st.pop();
}
else {
return false;
}
}
}
if(st.size() != 0)return false;
return true;
}
};
根据答案优化
class Solution {
string st = "";
public:
bool match(char a,char b)
{
if(a == '(' && b == ')')return true;
if(a == '{' && b == '}')return true;
if(a == '[' && b == ']')return true;
return false;
}
bool isValid(string s) {
int n = s.size();
if (n % 2)return false;
if (!n) return true;
char left;
for(int i = 0; i < n; i ++){
if(s[i] == '(' || s[i] == '{' || s[i] == '[')
{
st.push_back(s[i]);
}
else
{
if(st.size() == 0)return false;
left = st.back();
st.pop_back();
if(!match(left,s[i])){
return false;
}
}
}
if(st.size() != 0)return false;
return true;
}
};