题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/va…
实现
// 根据左括号得出右括号
char charMatch(char c)
{
if (c == '(') {
return ')';
} else if (c == '{') {
return '}';
} else if (c == '[') {
return ']';
} else {
return -1;
}
}
bool isValid(char *s)
{
// 根据题意用栈解决最方便
if (strlen(s) % 2 != 0) {
return false; // 奇数一定不会完全匹配
}
int top = -1; // 栈顶指针
char st[strlen(s) + 1];
memset(st, 0, strlen(s) + 1);
for (int i = 0; i < strlen(s); i++) {
if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
st[++top] = charMatch(s[i]);
} else {
if (top == -1) {
return false; // 直接是右括号,那么直接返回false
}
if (st[top] != s[i]) {
return false; // 右括号与最近的左括号不匹配,返回false
}
top--; // top位置的字符已经匹配,出栈
}
}
if (top == -1) {
return true; // 表明栈中没有不匹配的元素了,返回true
}
return false; // 匹配结束,栈中还有元素,返回false
}