题目

输入一个字符串,其中包含 [](){} 六种括号,请你判断这个字符串组成的括号是否合法。

题目示例

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 实现 【求字符串括号合法性 判断】相关推荐

  1. 面试题整理12 求字符串括号最大深度子串

    题目:求一个表达式字符串中括号层次最深的第一个表达式,如表达式  "a+b+((c+d)+(e+f))",则结果为"c+d". 分析: 一般算式会让人想起用 ...

  2. 刷题日记【第四篇】-笔试必刷题【Fibonacci数列+合法括号序列判断+两种排序方法+求最小公倍数】

    目录 选择题模块 1. 以下对继承的描述错误的是(A) 2. 在Java中,一个类(B) 3. 以下不是Object 类的方法的是(D) 4. Test.main() 函数执行后的输出是(D) 编程题 ...

  3. 判断字符串括号{}[]()是否闭合—python实现

    判断字符串闭合是一道经典的面试题,首先要知道什么样的括号是闭合的:{[{()}]()} 就是一个闭合的字符串. {[{()}]([)]} 这个里面 ([)] 括号不对称,这种就是不闭合. 常见的解法是 ...

  4. 【字符串2】(删除公共字符、合法括号序列判断、两种排序方法、密码强度等级)

    字符串题集 1. 删除公共字符 题目描述 题目分析 C++代码 2. 合法括号序列判断 题目描述 题目分析 C++代码 3. 两种排序方法 题目描述 题目分析 C++代码 4. 密码强度等级 题目描述 ...

  5. C语言中求字符串长度的函数my_strlen()的几种实现方法

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) {asse ...

  6. 【偏门技巧】C语言编程实现对IPV4地址的合法性判断(使用正则表达式)

    C语言编程实现对IPV4地址的合法性判断(使用正则表达式) 有了解过我的朋友,可能有点印象,我在N年前的博客中,就写了这个主题,当时确实是工作中遇到了这个问题.本想着等工作搞完之后,就把这个问题的解决 ...

  7. 【C语言】模拟实现库函数 strcpy(复制字符串内容) 与 strlen(求字符串长度)

    前言:对于库函数的使用,我们不仅要会使用方法,更要知晓使用原理,而知晓使用原理最好的方法就是模拟相应库函数的使用. 今天我们就来模拟 strcpy(复制字符串内容) 与 strlen(求字符串长度)这 ...

  8. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

    文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...

  9. LeetCode算法题2:求字符串b在字符串a中的起始下标

    文章目录 前言 一.题目描述 二.思路 1.朴素匹配 1.1Java直接实现 2.kmp模式匹配 总结 前言 本系列文章为leetCode刷题笔记,仅供参考. 一.题目描述 若字符串 a 包含字符串 ...

最新文章

  1. 电子计算机发展迅,ENIAC问世以来的短短的四十多年中,电子计算机的发展异常迅速...
  2. 【通知】3月第三周直播预告,模型精简前沿技术,人脸分析与编辑,图像风格化...
  3. 项目中用到的设计模式(持续更新)
  4. 岗位推荐 | 蚂蚁金服招聘机器学习、自然语言处理算法工程师
  5. u-boot移植第五弹——2013.10u-boot通过tftp下载到内存中运行
  6. Data Vault的一点思考(二)
  7. STATISTICS TIME ON
  8. 如何在Python中便宜地获取大文件的行数?
  9. 5. 公元二OO七年
  10. BZOJ3626 神思路的树链剖分+线段树维护
  11. C++中 sprintf函数的用法
  12. HBuilder 开发工具
  13. 给爱车安装一台GPS,贴身“保镖”保护爱车
  14. Android进阶——借助强大Span家族增添丰富的特效及格式化字符串
  15. 手把手教你如何向 Linux 内核提交代码
  16. Matplotlib的中文字体显示为方块的问题
  17. Linux 下的任务切换神器 Ctrl+Z
  18. 三种常用的朴素贝叶斯实现算法——高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯
  19. 互联网的下一站,大概率是能源
  20. 计算机网络技术在高校的应用,浅谈计算机网络技术在高校教学管理中的应用

热门文章

  1. 《天天数学》连载47:二月十六日
  2. 安卓学习笔记36:内容提供者
  3. 安装插件设置Intellij IDEA背景图片
  4. NOIP2017(不算是题解)
  5. java ==陷阱_Java小陷阱
  6. 【英语学习】【Level 07】U01 Making friends L2 A new friend from the past
  7. 【英语学习】【Daily English】U10 Education L02 I'm not a pushy parent
  8. 六、3D-3D ICP问题线性SVD解法与非线性BA解法
  9. Azkaban 进程和任务监控(任务状态从MySQL同步到SqlServer)
  10. php下xmlwriter,PHP实现基于XMLWriter操作xml的方法