一、题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例3:
输入:s = "(]"
输出:false
示例4:
输入:s = "([)]"
输出:false
示例5:
输入:s = "{[]}"
输出:true
二、解题思路
本题很明显需要用到栈这种抽象的数据类型,具体思路如下:
遍历字符串s,若栈为空,则当前字符入栈。
若栈不为空,则有下列两种大的情况
(1)当前字符为 ‘(’ 、’[’ 、’{’ 中的一种,只要为任意括号的左半边,则直接入栈。
(2)当前字符为 ‘)’ 、’]’ 、 '}'中的一种:
- a. 若为 ‘)’ 且 当前栈顶元素为 ‘(’ ,则栈顶元素出栈;若不为 ‘(’ ,则该元素继续入栈成为新的栈顶元素。
- b. 若为 ‘]’ 且 当前栈顶元素为 ‘[’ ,则栈顶元素出栈;若不为 ‘[’ ,则该元素继续入栈成为新的栈顶元素。
- c. 若为 ‘]’ 且 当前栈顶元素为 ‘{’ ,则栈顶元素出栈;若不为 ‘{’ ,则该元素继续入栈成为新的栈顶元素。
当遍历完整个字符串s后,若栈为空,则说明所有括号都被一一匹配,输出true;若栈不为空,则输出false。
三、ac代码
bool isValid(char * s){
int len = strlen(s);
char *arr = (int *)malloc( (len + 10) * sizeof(char));
int top = -1;
for (int i = 0; i < len; i ++ ) {
if (top == -1) arr[++top] = s[i];
else {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') arr[++top] = s[i];
else {
if (s[i] == ')') {
if (arr[top] == '(') top --;
else arr[++top] = s[i];
}
if (s[i] == ']') {
if (arr[top] == '[') top --;
else arr[++top] = s[i];
}
if (s[i] == '}') {
if (arr[top] == '{') top --;
else arr[++top] = s[i];
}
}
}
}
if (top == -1) return true;
else return false;
}
执行结果:
看完不妨点个赞。