你好,欢迎来到我的博客!作为一名程序员,我经常刷LeetCode题目来提升自己的编程能力。在我的博客里,我会分享一些我自己做过的题目和解题思路,希望能够帮助到大家。今天,我想和大家分享一道挑战性较高的题目,让我们一起来挑战一下吧!作者也是在学习的过程中刷到有意思的题目就会选择与大家分享,并且提供较优解,关于力扣的文章全部放在博客,如果大家喜欢记得支持作者。🤓
题目难度:简单
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 3.每个右括号都有一个对应的相同类型的左括号。
示例一:
输入:s = “()[]{}”
输出:true
示例二:
输入:s = “(]”
输出:false
示例三:
输入:s = “([{}])”
输出:true
解题思路💡
总结:题目叫我们对有效括号字符串进行判断,大概意思为,字符串输入完成后,必须保证字符串内括号全部匹配上(要求参考题目与示例),我们可以选择使用栈来存储左括号,因为最后进入的左括号会被最先拿出去匹配,符合题意按顺序闭合,要是发现有不匹配直接返回false。(接下来带来两种使用栈的解法)
本题可以说是标准的栈练习题了,如果使用C++会非常简单因为直接调用栈库函数即可,使用C语言需要手写一个栈(如果不了解栈的小伙伴们可以点击跳转)。
匹配成功示例
匹配失败示例
解题步骤
(第一步)
- 写出一个
栈
,有基本的初始化、入栈、出栈、销毁等常用栈功能,方便后续调用。
(第二步)
- 对字符串s进行遍历
(第三步)
- 遍历字符串s,将左括号放栈中,右括号与栈顶的左括号进行匹配,匹配不成功返回false,如果字符为右括号时栈为空则直接返回false,遍历到字符串的结尾没有出现匹配失败且栈为空则返回true。
解法一⭐
typedef char STDataType;
typedef struct STNode //栈结构体
{
STDataType* str;
int top;
int capacity;
}STNode;
void STInit(STNode* pst)
{
assert(pst);
pst->str = NULL;
pst->top = 0;
pst->capacity = 0;
}
bool STEmpty(STNode* pst)
{
assert(pst);
return pst->top == 0;
}
void STPush(STNode* pst, STDataType data)
{
assert(pst);
if (pst->top == pst->capacity)
{
int Newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
STDataType* temp = (STDataType*)realloc(pst->str,sizeof(STDataType) * Newcapacity);
if (temp == NULL)
{
perror("malloc error");
return;
}
pst->str = temp;
pst->capacity = Newcapacity;
}
pst->str[pst->top++] = data;
}
void STPop(STNode* pst)
{
assert(pst);
assert(!STEmpty(pst));
pst->top--;
}
void STDestroy(STNode* pst)
{
assert(pst);
free(pst->str);
pst->top = 0;
pst->capacity = 0;
}
STDataType STTop(STNode* pst)
{
assert(pst);
assert(!STEmpty(pst));
return pst->str[pst->top - 1];
}
bool isValid(char* s) {
STNode pst;
STInit(&pst);
while (*s)
{
if (*s == '(' || *s == '[' || *s == '{')
{
STPush(&pst, *s);
}
else
{
if (STEmpty(&pst))
return false;
if ((STTop(&pst) == '(' && *s != ')')
|| (STTop(&pst) == '[' && *s != ']')
|| (STTop(&pst) == '{' && *s != '}'))
{
return false;
}
else
{
STPop(&pst);
}
}
s++;
}
return STEmpty(&pst);
}
解法二🌈(更优解)
其实这种解法也是使用栈的形式,只不过用数组来模拟栈来操作。
解题步骤
:
-
定义一个数组来装字符串,并且定义一个top当作栈顶
-
遍历字符串,左括号放在数组里,匹配到右括号与栈顶元素进行匹配,全部匹配成功返回true,匹配失败返回false,如果遍历到右括号时数组中没有左括号直接返回false
bool isValid(char * s)
{
char a[10000]=" ",t;
int i=0,top=0;
while(s[i]!='\0')
{
if(s[i]=='('||s[i]=='{'||s[i]=='[')
{
if(s[i]=='(') t=')';
if(s[i]=='{') t='}';
if(s[i]=='[') t=']';
top++;
a[top]=t;
}
else
{
if(a[top]!=s[i])
return false;
else
top--;
}
i++;
}
if(top==0)
return true;
else
return false;
}
完结
当你喜欢一篇文章时,点赞、收藏和关注是最好的支持方式。如果你喜欢我的文章,请不要吝啬你的支持,点赞👍、收藏⭐和关注都是对我最好的鼓励。感谢你们的支持!