给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
解题思路:遍历题给字符串,新建一个栈或者vector,如果是左括号的话,一律压入,如果是右括号,则看前一个被压入的是不是与之匹配的左括号,这需要分类讨论,如果不是,则返回false,否则就将左括号删除,继续遍历下一个元素、以此类推。直到新建的栈或者vector中没有元素,返回true,否则返回false。
代码1如下:(使用vector)
class Solution {
public:
bool isValid(string s) {
int len = ();
vector<char> stack;
for (int i = 0; i < len; i++) {
// 左括号压栈
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
stack.push_back(s[i]);
else {
// 右括号出栈
if (())
return false;
char top = stack[() - 1];
if (s[i] == ')' && top != '(')
return false;
if (s[i] == ']' && top != '[')
return false;
if (s[i] == '}' && top != '{')
return false;
stack.pop_back();
}
}
// 栈中无多余左括号
if (() > 0)
return false;
return true;
}
};
代码2如下:(使用栈)
class Solution {
public:
bool isValid(string s) {
int len = ();
stack<char> temp;
for (int i = 0; i < len; i++) {
// 左括号压栈
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
(s[i]);
else {
// 右括号出栈
if (())
return false;
char top = ();
if (s[i] == ')' && top != '(')
return false;
if (s[i] == ']' && top != '[')
return false;
if (s[i] == '}' && top != '{')
return false;
();
}
}
// 栈中无多余左括号
if (!())
return false;
return true;
}
};
解题思路2:在思路一的基础上,可以不需要分类讨论,可以在最开始的时候搞一个map,这样每次都是右括号的情况就可以从map中查了,而不用其他多余判断。其他的思路大致一样。
代码如下:
class Solution {
public:
bool isValid(string s) {
map<char, char> kuohao;
kuohao['('] = ')';
kuohao['{'] = '}';
kuohao['['] = ']';
stack<char> temp;
for (int i = 0; i < (); i++) {
if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
(s[i]);
}
else if (() || kuohao[()] != s[i]) {
return false;
}
else {
();
}
}
return ();
}
};