Golang 实现 【求字符串括号合法性 判断】
题目
输入一个字符串,其中包含 [](){}
六种括号,请你判断这个字符串组成的括号是否合法。
题目示例
Input: "()[]{}"
Output: trueInput: "([)]"
Output: falseInput: "{[]}"
Output: true
第一种实现方式
解题思路
利用堆栈数据结构的特性:
1、先入后出,后入先出。
2、除头尾节点之外,每个元素有一个前驱,一个后继。
利用堆栈解题的时间复杂度 O(n)
Golang解题代码
import ("container/list""fmt""testing"
)func TestStrValid(t *testing.T) {str:="[([{}])]"fmt.Printf("str:%v, res: %v;\n ",str,is_valid(str))str="[]{}()"fmt.Printf("str:%v, res: %v;\n ",str,is_valid(str))str="[]{})("fmt.Printf("str:%v, res: %v;\n ",str,is_valid(str))
}func is_valid(str string) bool{strLen:=len(str)//判断数据合法性,基本的校验if strLen == 0 {return true}if strLen % 2 == 1 {return false}//利用go里面的list 模拟stack 主要用到front 、remove 方法来模拟堆栈的POP、Push方法stack := list.New()pairsMap:= map[byte]byte{')':'(',']':'[','}':'{'}for i:=0 ;i< strLen ;i++ {value:=str[i]//碰见左边的入栈,右边则不入栈,并获取上一个元素与该元素匹配是否正确if pairsMap[value] == 0 {//入栈stack.PushFront(value)}else{//出栈、通过右边获取map中的值,与list front相对比if stack.Len()==0 || stack.Front().Value != pairsMap[value]{return false}//fmt.Printf("front value:%v; value:%v \n",stack.Front().Value,pairsMap[value])//匹配成功则删除、左右删除,知道最后stack.Remove(stack.Front())}}//最后判断list的len大小return stack.Len()==0
}
结果验证
代码剖析&总结
示例字符串:"()[]{}"思路:左边的入栈、右边不入栈、获取栈上个元素、判断左右是否成对,一旦成对,则删除按照上述思路,写伪代码解题:首先需要定义map,map的用途有两个,第一是:判断是左边还是右边,第二是判断是否成对此外定义栈,这里用go的list模拟stactstack := list.New()Map存储结构k-v,存储内容如下')':'('']':'[''}':'{'第一次入栈:( //遍历上述字符串,判断该key是否存在,不存在,则是左边,左边的入栈stack第二次入栈: ) //右边不入栈、根据右边的key,获取map的value,并获取栈stack的数据与之匹配,看是否成对,如不成对,则直接返回false,如成对,则可删除该对符号最后,直接判断栈的大小,如果等于零的,则说明该字符串全部成对
第二种实现方式
解题思路
判断字符串括号合法性,首先该字符串是偶数,另外字符串首部和尾部是必然是成对的,利用该思路,循环首先从首位向中间对比。
利用该思路解题的时间复杂度 O(n/2)
Golang解题代码
func is_valid_v1(str string) bool{strLen:=len(str)//判断数据合法性,基本的校验if strLen == 0 {return true}if strLen % 2 == 1 {return false}//判断标识位从根据右边获取左边的pairsMap:= map[byte]byte{')':'(',']':'[','}':'{'}//判断标识位从根据左边边获取右边的//pairsMap= map[byte]byte{'(':')','[':']','{':'}'}for i:=0 ;i< strLen/2 ;i++ {indexValue:=str[i]lastValue:=str[strLen-1-i]//因map是右边获取左边,则用lastValue 对比indexValueif pairsMap[lastValue]!=indexValue {//如果上述用pairsMap= map[byte]byte{'(':')','[':']','{':'}'} 这判断用indexValue获取对比lastValue//if pairsMap[indexValue]!=lastValue{return false}}return true
}
Golang 实现 【求字符串括号合法性 判断】相关推荐
- 面试题整理12 求字符串括号最大深度子串
题目:求一个表达式字符串中括号层次最深的第一个表达式,如表达式 "a+b+((c+d)+(e+f))",则结果为"c+d". 分析: 一般算式会让人想起用 ...
- 刷题日记【第四篇】-笔试必刷题【Fibonacci数列+合法括号序列判断+两种排序方法+求最小公倍数】
目录 选择题模块 1. 以下对继承的描述错误的是(A) 2. 在Java中,一个类(B) 3. 以下不是Object 类的方法的是(D) 4. Test.main() 函数执行后的输出是(D) 编程题 ...
- 判断字符串括号{}[]()是否闭合—python实现
判断字符串闭合是一道经典的面试题,首先要知道什么样的括号是闭合的:{[{()}]()} 就是一个闭合的字符串. {[{()}]([)]} 这个里面 ([)] 括号不对称,这种就是不闭合. 常见的解法是 ...
- 【字符串2】(删除公共字符、合法括号序列判断、两种排序方法、密码强度等级)
字符串题集 1. 删除公共字符 题目描述 题目分析 C++代码 2. 合法括号序列判断 题目描述 题目分析 C++代码 3. 两种排序方法 题目描述 题目分析 C++代码 4. 密码强度等级 题目描述 ...
- C语言中求字符串长度的函数my_strlen()的几种实现方法
C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) {asse ...
- 【偏门技巧】C语言编程实现对IPV4地址的合法性判断(使用正则表达式)
C语言编程实现对IPV4地址的合法性判断(使用正则表达式) 有了解过我的朋友,可能有点印象,我在N年前的博客中,就写了这个主题,当时确实是工作中遇到了这个问题.本想着等工作搞完之后,就把这个问题的解决 ...
- 【C语言】模拟实现库函数 strcpy(复制字符串内容) 与 strlen(求字符串长度)
前言:对于库函数的使用,我们不仅要会使用方法,更要知晓使用原理,而知晓使用原理最好的方法就是模拟相应库函数的使用. 今天我们就来模拟 strcpy(复制字符串内容) 与 strlen(求字符串长度)这 ...
- 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...
- LeetCode算法题2:求字符串b在字符串a中的起始下标
文章目录 前言 一.题目描述 二.思路 1.朴素匹配 1.1Java直接实现 2.kmp模式匹配 总结 前言 本系列文章为leetCode刷题笔记,仅供参考. 一.题目描述 若字符串 a 包含字符串 ...
最新文章
- 电子计算机发展迅,ENIAC问世以来的短短的四十多年中,电子计算机的发展异常迅速...
- 【通知】3月第三周直播预告,模型精简前沿技术,人脸分析与编辑,图像风格化...
- 项目中用到的设计模式(持续更新)
- 岗位推荐 | 蚂蚁金服招聘机器学习、自然语言处理算法工程师
- u-boot移植第五弹——2013.10u-boot通过tftp下载到内存中运行
- Data Vault的一点思考(二)
- STATISTICS TIME ON
- 如何在Python中便宜地获取大文件的行数?
- 5. 公元二OO七年
- BZOJ3626 神思路的树链剖分+线段树维护
- C++中 sprintf函数的用法
- HBuilder 开发工具
- 给爱车安装一台GPS,贴身“保镖”保护爱车
- Android进阶——借助强大Span家族增添丰富的特效及格式化字符串
- 手把手教你如何向 Linux 内核提交代码
- Matplotlib的中文字体显示为方块的问题
- Linux 下的任务切换神器 Ctrl+Z
- 三种常用的朴素贝叶斯实现算法——高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯
- 互联网的下一站,大概率是能源
- 计算机网络技术在高校的应用,浅谈计算机网络技术在高校教学管理中的应用
热门文章
- 《天天数学》连载47:二月十六日
- 安卓学习笔记36:内容提供者
- 安装插件设置Intellij IDEA背景图片
- NOIP2017(不算是题解)
- java ==陷阱_Java小陷阱
- 【英语学习】【Level 07】U01 Making friends L2 A new friend from the past
- 【英语学习】【Daily English】U10 Education L02 I'm not a pushy parent
- 六、3D-3D ICP问题线性SVD解法与非线性BA解法
- Azkaban 进程和任务监控(任务状态从MySQL同步到SqlServer)
- php下xmlwriter,PHP实现基于XMLWriter操作xml的方法