有效括号算法题

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true

拿到这道题,首先是想到要用什么样的数据结构来模拟这个过程。匹配的时候需要和相近的最后一个元素来做匹配,有点先进后出的味道,所以先考虑使用栈来实现。
而除了我们自定义数据结构stack外,不同的编程语言有对应的可以用来模拟stack的原生数据结构。

如PHP中的万金油:array,Python中的list(列表),这次我们还是使用Golang来实现算法,所以考虑用slice来模拟出栈和进栈。

大方向确定后也要考虑一些边界问题,例如当时空字符串的时候,也是有效的。

整理思路如下:
1.获取s字符串的长度。
2.判断长度是否非空,如果为空,则返回true。
3.判断长度是否为偶数,如果不是偶数,那么肯定不能成对匹配,总会剩下一个“老光棍”字符,就是无效的。
4.循环匹配,如果当前循环的字符是“{”、“[”、“(”之一,则入栈到stack里面。然后后面的如果是成对的另外一个字符,那就可以把之前栈顶的那个元素出栈,有点类似于消消乐的感觉,就近匹配,就近销毁。

Talk is cheap, show you my codes:

package main

import "fmt"

func isValid(s string) bool {
    my_dick := map[byte] byte {']':'[', ')':'(', '}': '{'} // The single char's type is byte, pay attention please.
    s_len := len(s) // Get the length of the string s

    var stack []byte // Just use a empty slice to mock the stack
    if s_len == 0 {
        return true
    }
    if s_len % 2 != 0 { // If the length of the string s is not even number, it could not be valid
        return false
    }
    for i := 0; i < s_len; i++ {
        if s[i] == '[' || s[i] == '{' || s[i] == '(' { // First char should be these
            stack = append(stack, s[i]) // push it to slice
        } else if len(stack) == 0 { // Once empty slice just pass to next item.
            return false
        } else {
            if my_dick[s[i]] == stack[len(stack)-1] {
                stack = stack[:len(stack) -1] // pop the last item
            } else {
                return false
            }
        }
    }
    if len(stack) == 0 {
        return true
    } else {
        return false
    }
}

func main() {
    result := isValid("{[}}")
    fmt.Println(result)
}

简单的问题也可以思考很多,这大概就是编程的魅力吧。

有效括号算法题(Golang实现)的更多相关文章

  1. LeetCode算法题-Construct String from Binary Tree(Java实现)

    这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...

  2. 【算法】LeetCode算法题-Valid Parentheses

    这是悦乐书的第147次更新,第149篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第6题(顺位题号是20),给定一个只包含字符'(',')','{','}','['和'] ...

  3. python算法题 python123网站单元四题目

    目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来)   下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 ...

  4. 看完互联网大佬的「LeetCode 刷题手册」, 手撕了 400 道 Leetcode 算法题

    大家好,我是 程序员小熊 ,来自 大厂 的程序猿.相信绝大部分程序猿都有一个进大厂的梦想,但相较于以前,目前大厂的面试,只要是研发相关岗位,算法题基本少不了,所以现在很多人都会去刷 Leetcode ...

  5. 一道java算法题分析

    最近在面试中遇到这样的一道算法题:       求100!的结果的各位数之和为多少?       如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...

  6. FCC上的初级算法题

    核心提示:FCC的算法题一共16道.跟之前简单到令人发指的基础题目相比,难度是上了一个台阶.主要涉及初步的字符串,数组等运算.仍然属于基础的基础,官方网站给出的建议完成时间为50小时,超出了之前所有非 ...

  7. 解决一道leetcode算法题的曲折过程及引发的思考

    写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...

  8. js 中的算法题,那些经常看到的

    js中遇到的算法题不是很多,可以说基本遇不到.但面试的时候,尤其是一些大公司,总是会出这样那样的算法题,考察一个程序员的逻辑思维能力.如下: 1.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...

  9. JavaScript算法题之–随机数的生成

    JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2      ...

随机推荐

  1. 前端面试题-url、href、src

    一.URL的概念 统一资源定位符(或称统一资源定位器/定位地址.URL地址等,英语:Uniform Resource Locator,常缩写为URL),有时也被俗称为网页地址(网址).如同在网络上的门 ...

  2. 前端每日实战:39# 视频演示如何用纯 CSS 创作一个表达怀念童年心情的条纹彩虹心特效

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/QxbmxJ 可交互视频教程 此视频 ...

  3. 关于Html+css阶段学习总结

    一.学习经历 进入大学不久,就加入了社团,从而对前端有了一个初步的了解,之后也做过一些学校的官网,积累了一些微小的经验. 到了大二的时候,学校开设了专门的html+css课程,从中也学到许多新的htm ...

  4. 细说集群技术(Cluster)

    今天本人给大家讲解一些我对集群技术一个理解,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 集群(Cluster)技术:通过此可以用较低的成本获取较高的性能 ...

  5. 28 复杂的使用Specification查询

    /** * Specification的多表查询 */ @Test public void testFind() { Specification<LinkMan> spec = new S ...

  6. RIP实验

    实验要求 1.  理解 RIP 协议的工作原理2.  理解 RIPv1.RIPv2 的特性3.  掌握 RIP 协议的基本配置方法4.  掌握 RIP 自动汇总和手动汇总的方法5.  掌握 RIP 配 ...

  7. git常规使用命令笔记

    使用git也有不短的时间,这篇文章主要默写自己在提交代码经常使用的一些密令,仅供参考并不是教程. git log 查看日志 git branch 查看分值 git branch Name 新建一个Na ...

  8. git基础教程(八)

    8. gitlab相关介绍 8.1 gitlab优势 社区版本,自己可以在公司搭建环境 维护人员多,版本更新块 易用性强,上手快 集成CI(持续集成) 集成CD(持续发布) 8.2 持续集成 8.2. ...

  9. 微信小程序开发(一)开发准备

    微信小程序开发(一)开发准备 微信小程序,近几年,越来越火,应用场景越来越多,好大学习起来,比较容易,学习曲线平缓,你要是会前端开发,那简直可以用易如反掌来形容. 小程序,开发工具官方也提供了,他兼容 ...

  10. JVM 参数及各部分含义(转)

    转自:https://www.jianshu.com/p/1c6b5c2e95f9 JVM参数分类 JVM参数分为标准参数和非标准参数: 标准参数: "-"开头的参数,如-clie ...