利用栈解决括号匹配问题 -- 算法数据结构面试分享(三)
发表于:2024-10-03 作者:千家信息网编辑
千家信息网最后更新 2024年10月03日,算法数据结构面试分享 符号匹配问题今天在帖子上看见有同学在问,如果一个字符串中包含大括号和小括号,我们该如何解决括号匹配问题。我们今天就一起看下这道题吧。按照我们之前的套路,按部就班来:1. 确保我们
千家信息网最后更新 2024年10月03日利用栈解决括号匹配问题 -- 算法数据结构面试分享(三)
算法数据结构面试分享 符号匹配问题
今天在帖子上看见有同学在问,如果一个字符串中包含大括号和小括号,我们该如何解决括号匹配问题。我们今天就一起看下这道题吧。按照我们之前的套路,按部就班来:
1. 确保我们理解了问题,并且尝试一个例子,确认理解无误。
举个例子,这样的括号是匹配的, ()、{}、({}), ({()}(){}), 而类似于{(、{,({)都是不匹配的。
2. 想想你可以用什么方法解决问题,你会选择哪一种,为什么?
我们拿这个字符串为例,({()}(){}), 最后一个)匹配的是第一个(, 倒数一个}匹配的是倒数第三个。所以我们可以从尾往头扫描,第一个)我们先记录下来,第一个}我们记录下来,第三个{我们发现它和}是匹配的,消除掉,第四个是),我们保存下来,第五个是(,我们发现和第四个匹配,消除掉,依次类推,到最后一个(,我们发现它还最开始的第一个匹配。所以我们自然想到了栈,不匹配我们就入栈,匹配我们就出栈。
3. 解释你的算法和实现的方法
我们申明两个栈,首先将所有字符依次入栈,再逐个出栈,出栈时,我们看下辅助栈里的第一个字符是否匹配,若匹配我们出栈,否则入栈。当主栈里所有字符都出栈时,我们检查辅助栈是否为空。空表示完全匹配,否则不匹配。
4. 写代码的时候,记住,一定要解释你现在在干什么
我们先来定义一个栈,一般我们会借助于数组,这里我们就简单的用列表来处理了,实现它的Pop, Push, IsEmpty 方法,看代码:
public class Mystack { private List list = new List(); public Mystack() { } public Mystack(T[] input) { if (input != null) { for (int index = 0; index < input.Length; index++) { list.Add(input[index]); } } } public T Pop() { if (!this.IsEmpty()) { T element = list[list.Count-1]; list.RemoveAt(list.Count-1); return element; } throw new IndexOutOfRangeException("The stack is empty already."); } public void Push(T element) { list.Add(element); } public bool IsEmpty() { return this.list.Count == 0; } }
接下来,我们看算法:
public static bool IsMatch(string input) { if (!string.IsNullOrEmpty(input)) { Mystack stack = new Mystack(input.ToArray()); Mystack secondStack = new Mystack(); while (!stack.IsEmpty()) { char current = stack.Pop(); if (secondStack.IsEmpty()) { secondStack.Push(current); } else { char target = secondStack.Pop(); if (!IsClosed(current, target)) { secondStack.Push(target); secondStack.Push(current); } } } return secondStack.IsEmpty(); } return false; }
这中间使用了一个IsClosed方法,我们用来匹配 ( 和 ), { 和 }, 看代码:
private static bool IsClosed(char first, char second) { if (first == '(') return second == ')'; if (first == '{') return second == '}'; return false; }
最后我们一起来测试这个方法:
static void Main(string[] args) { string input = "({(){}})"; var result = IsMatch(input); Console.WriteLine(result); }
欢迎大家关注我的公众号,还有我的专题系列:
- 视频教程,
- 数据结构与算法
- 经典算法面试题辅导
- 排序专题讲解
- 链表专题讲解。
大家有什么更好的解法,也欢迎讨论哈。
算法
字符
方法
括号
问题
专题
代码
数据
数据结构
结构
三个
例子
字符串
解释
辅助
按部就班
接下来
两个
公众
同学
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
山东省浪潮存储服务器销售电话
go远控软件开发教程
医院网络安全等级保护招标
服务器如何配置管理口
软件开发者的寓意
肇庆手机软件开发报价
计算机网络技术岗位说明书
河北数据库防护箱工程
科技发展和互联网的关系
交通运输网络安全保障体系
qt打开数据库
秦淮区定制app软件开发
数据库访问层
方舟多人模式怎么创建服务器
网络安全项目可行性报告
网络安全管理科研项目
学软件开发多少时间
谷歌地球中文版连接服务器
网络安全排版图片
网络安全专业电脑
云服务器可以进行域控吗
雕龙数据库
服务器防护app哪个好
树莓派服务器端口有多大
阿里国产化数据库
uc服务器安全狗
德州网络技术有限公司 电话
网络应用工程师和网络安全工程师
服务器端口安装教程
网络安全培训周末班