目录
题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true示例 2:
输入:s = "()[]{}" 输出:true示例 3:
输入:s = "(]" 输出:false
题目分析
1)、首先括号如果匹配的话字符串的长度肯定是偶数,所以如果字符串的长度是奇数则肯定不匹配。
2)、在解决这道问题时很容易想到使用栈来解决括号匹配的问题,当遇到'('或'['或'{'时,先将栈顶指针加1,并将这个元素入栈;初始栈顶指针top设为-1,当遇到')'或']'或'}'时,看栈顶元素是否匹配,不匹配则直接返回false,匹配则出栈栈顶元素,并将栈顶指针-1。
3)、当遍历完字符串后,查看栈顶指针是否为-1,为-1则说明匹配,反之则不匹配。
解决代码
bool isValid(char* s) {
int len = strlen(s);
if(len%2==1)
{
return false;
}
char *stack = (char *)malloc(sizeof(char)*(len+1));
int top = -1;
for(int i=0;i<len;i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
{
stack[++top]=s[i];
}
else if(s[i]==')' && top>-1 && stack[top]=='(') top--;
else if(s[i]==']' && top>-1 && stack[top]=='[') top--;
else if(s[i]=='}' && top>-1 && stack[top]=='{') top--;
else return false;
}
if(top==-1)
return true;
else
return false;
总结
总的来说这道题的难度不高,理解栈的工作原理即可解决问题!!