20. 有效的括号 题解

题目描述:20. 有效的括号 - 力扣(LeetCode)

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

20. 有效的括号 题解_第1张图片

 解题思路:

当解决有效的括号问题时,我们需要使用一种数据结构来检查括号的闭合顺序。栈(Stack)是一个非常适合这个问题的数据结构,因为它遵循"后进先出"(Last In First Out,LIFO)的原则,与括号的嵌套结构相符。

  1. 首先,我们创建一个空栈,用于存储括号字符。

  2. 遍历输入的字符串 s 中的每个字符:

    • 如果字符是开括号('(', '{', '['),将其推入栈中。
    • 如果字符是闭括号(')', '}', ']'),我们需要检查栈是否为空
      • 如果栈为空,表示没有对应的开括号与之匹配,返回 False。
      • 如果栈不为空,则从栈顶弹出一个元素,并与当前字符对应的开括号进行匹配。如果不匹配,返回 False。
  3. 当遍历完所有字符后,检查栈是否为空

    • 如果栈为空,表示所有的括号都已经正确闭合,返回 True。
    • 如果栈不为空,表示还有未闭合的括号,返回 False。

注:

  • 如果字符是闭括号(')', '}', ']'),我们为什么需要检查栈是否为空

如果不检查栈为空时,遇到右括号直接进行从栈顶弹出一个元素,会造成越界访问。

同时,也要注意在返回之前一定要free开辟的空间,否则会造成内存泄漏:

其对应的情况可能是:

①遇到第一个括号是右括号,此时栈为空,没有进行开辟空间,直接返回不会造成内存泄漏;

②如果情况是:'(', '{', '}',')', ']'-->当遇到右括号‘]’时,栈中没有元素,栈为空,但是栈所用的空间没有free,此时如果没有free直接返回,就会造成内存泄漏。(就相当于,你买一瓶矿泉水,你把水喝完后,瓶子还在)

  • 当遍历完所有字符后,为什么要检查栈是否为空?

要应对的情况是:

①'[', '(', '{', '}',')'     当右括号 '}',')' 都匹配完后,栈中还剩下'[',则说明'['没有右括号与其匹配;

②全是左括号的情况。

代码:

bool isValid(char * s)
{
    Stack stack;
		StackInit(&stack);
    while(*s)
    {
        // 如果是左括号,就入栈
        if(*s=='(' || *s=='{' || *s=='[')
        {
            StackPush(&stack, *s);
            s++;
        }
        else // 如果是右括号,就出栈匹配
        {
					        // 遇到右括号时,但是栈为空,说明没有左括号与其匹配
			if(StackEmpty(&stack))
			{
				StackDestroy(&stack);
				return false;
			}
            STDataType temp =  StackTop(&stack);
						StackPop(&stack);
            if((*s==')' && temp!='(') || 
                (*s==']' && temp!='[') || 
                (*s=='}' && temp!='{'))
            {
                StackDestroy(&stack);
                return false;
            }
			else
			{
				s++;
			}
        }
    }
		// 如果栈中不是空,说明栈中还有左括号,有左括号没有匹配(全是左括号)
	bool ret  = StackEmpty(&stack);
    StackDestroy(&stack);
    return ret;
}

这种算法的时间复杂度是 O(n),其中 n 是输入字符串的长度,因为我们需要遍历一次输入字符串。空间复杂度是 O(n),因为最坏情况下,栈中可能需要存储所有的字符。


本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……

你可能感兴趣的:(算法,数据结构)