地址:
力扣https://leetcode-cn.com/problems/valid-parentheses/
题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()" 输出:true |
示例 2:
输入:s = "()[]{}" 输出:true |
示例 3:
输入:s = "(]" 输出:false |
示例 4:
输入:s = "([)]" 输出:false |
示例 5:
输入:s = "{[]}" 输出:true |
提示:
1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
判断有两种情况:
1. 是否成对
2. 是否顺序匹配
如果要依次遍历,复杂情况有点麻烦
我们在处理后面的 右括号 时需要往前追溯 存在的左括号
这类情况就如同 先进后出,栈的结构,那么问题就化简为
1. 遇见左括号,将其对应的 右括号入栈
2. 遇见右括号,把栈里面的元素出栈,如果不是期望的右括号,表示不匹配
当然还要处理一些边界条件
这个题属于 394. 字符串解码 的超简化题型
方法一、栈操作
同样需要自行构建 栈 的 API,再来处理逻辑
typedef struct {
char *stk;
int stkSize;
int stkCapacity;
} MyStack;
MyStack *myStackCreate(int capacity)
{
MyStack *stack = (MyStack *)malloc(sizeof(MyStack));
stack->stk = (char *)malloc(sizeof(char) * capacity);
stack->stkSize = 0;
stack->stkCapacity = capacity;
return stack;
}
void myStackFree(MyStack *stack)
{
if(stack)
{
free(stack->stk);
free(stack);
}
}
bool myStackEmpty(MyStack *stack) {
return stack->stkSize == 0;
}
void myStackPush(MyStack *stack, char x)
{
stack->stk[stack->stkSize++] = x;
}
void myStackPop(MyStack *stack)
{
stack->stkSize--;
}
char myStackTop(MyStack *stack)
{
return stack->stk[stack->stkSize - 1];
}
bool isValid(char * s){
bool ret = true;
int sLen = strlen(s);
MyStack *stk = myStackCreate(sLen);
char *p = s;
int i = 0;
while(p[i])
{
if(p[i] == '(')
{
myStackPush(stk,')');
}
else if (p[i] == '[')
{
myStackPush(stk,']');
}
else if (p[i] == '{')
{
myStackPush(stk,'}');
}
else if( myStackEmpty(stk) || p[i] != myStackTop(stk) )
{
ret = false;
break;
}
else
myStackPop(stk);
i++;
}
if( ! myStackEmpty(stk))
ret = false;
myStackFree(stk);
return ret;
}