【LeetCode】6.有效的括号

本文深入探讨了括号匹配问题的解决策略,采用栈数据结构实现有效字符串的判断,通过具体示例和代码演示,详细讲解了算法原理及其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

举例:

 

1.题目分析

拿到这道题首先想到的是利用栈,这也是括号问题的经典解法。思路是:

(0).若字符串为空,返回true

(1).首先在栈底放入一个元素‘s’,在字符串末尾放一个相同的元素's'。这样做可以防止栈.top()时报错,可以防止这种情况:假如s[0]就为“'[”,这时候若栈里面为空,比较s[0]和.top时,会报错。

(1).从左边起遍历括号

(2).遇到左括号进栈

(3).此时遇到的元素若是与栈顶元素不匹配,则遍历结束,返回false。

(4).此时遇到的元素若是与栈顶元素匹配,则让栈顶元素出栈,同时不管这个此时的右括号,继续遍历。

(5).若遍历结束,这时候栈也为空,则返回true

 

 

2.栈的基本用法

在C++中,使用标准库的栈时, 应包含相关头文件,在栈中应包含头文件: #include< stack > 。定义:stack< int > s;

常见的用法:

s.empty();         //如果栈为空则返回true, 否则返回false;
s.size();          //返回栈中元素的个数
s.top();           //返回栈顶元素, 但不删除该元素
s.pop();           //弹出栈顶元素, 但不返回其值
s.push();          //将元素压入栈顶

3.代码

这道题解法代码如下:

class Solution {
public:
    bool isValid(string s) {

	stack<char> bracket;
    s = s + 's';
	map<char, int> hash;
	hash['s'] = 0;
	hash['('] = 1;
	hash[')'] = 1;
	hash['['] = 2;
	hash[']'] = 2;
	hash['{'] = 3;
	hash['}'] = 3;
	if (s.length() > 0)
	{
            bracket.push('s');
			for (int i = 0; i < s.length(); i++)
			{
				if (s[i] == '(' || s[i] == '[' || s[i] == '{')
				{
					bracket.push(s[i]);
				}
				else if (hash[s[i]]==hash[bracket.top()])  //匹配
				{
					bracket.pop();
				}
				else
				{
					return 0;
				}
			}

		if (bracket.empty())   
			{
				return 1;  
			}
		
		else //遍历结束后栈不为空
			return  0;
	}
    else
        return 1;  //输入的s是空字符串
    }
};

用时:

代码有一次遍历,每次遍历处理的内容是常数时间复杂度,所以整体时间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值