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

有效字符串需满足:

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

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

思路:

遍历字符串,将左括号入栈,遇到右括号就将栈顶元素出栈,比较栈顶元素与相应的右括号对应的左括号是否相同,相同则将栈顶元素出栈,然后继续循环,当stack为空时,也直接返回false。不相同则表示不匹配,返回false。

将右括号作为hash表的键,相应的左括号作为值,存储在map中。

一、JS解法/**

* @param {string} s

* @return {boolean}

*/

const isValid = function (s) {

// 如果为奇数,则肯定不满足条件

if (s.length % 2 !== 0) {

return false

}

// 初始化一个map

const map = new Map([

[')', '('],

['}', '{'],

[']', '[']

])

const stack = []

const len = s.length

for (let i = 0; i < len; i++) {

// 如果字符在map中存在,即作为map的键存在,则说明遍历到的是右括号

// 此时,需要判断其前一个元素(即栈顶的元素)是否是对应的左括号

// 是则将栈顶元素出栈,否则则返回false,即不匹配

if (map.has(s[i])) {

// 栈为空或者栈顶元素与右括号对应的左括号不同则表示不匹配

if (!stack.length || stack[stack.length - 1] !== map.get(s[i])) {

return false

} else {

// 当前元素匹配,则进行下一次循环

stack.pop()

}

} else {

// 如果字符不在map中存在,这说明是左括号,将其入栈即可

stack.push(s[i])

}

}

return !stack.length

}

console.log(isValid("){"))官方给的解答中使用的是数组的forEach()方法,此方法return不能直接跳出循环,continue和break也不起作用,因此官方解答提交无法通过。此处直接使用for循环遍历字符串即可。

二、C语言解法bool isValid(char * s){

int len = strlen(s);

if (len % 2 != 0) {

return false;

}

char *stack = (char *)malloc((len + 1) * sizeof(char));

memset(stack, 0, len+1);

for (int i = 0; i < len; i++) {

if (s[i] == ')' || s[i] == ']' || s[i] == '}') {

if (!strlen(stack) || stack[strlen(stack) - 1] + 1 != s[i] && stack[strlen(stack) - 1] + 2 != s[i]) {

return false;

} else {

stack[strlen(stack) - 1] = 0;

}

} else {

stack[strlen(stack)] = s[i];

}

}

return !strlen(stack);

}

思路一样,不过C中没有map,因此用ASCII值做了一些判断。右括号ASCII值比左括号大1或者2。

c语言 malloc前的括号,20. 有效的括号(LeetCode)——C语言及JS实现相关推荐

  1. 代码随想录算法训练Day11 LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    代码随想录算法训练Day11 | LeetCode232. 用栈实现队列(模拟):225.用队列实现栈(模拟):20. 有效的括号(栈应用):1047. 删除字符串中的所有相邻重复项(栈应用) 关于栈 ...

  2. 20. 有效的括号-C语言

    题目来源:力扣 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正 ...

  3. LeetCode19删除链表的倒数第N个节点20有效的括号

    维护不易,还请点赞支持,微信搜索bigsai 回复进群一起打卡. 19删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1-> ...

  4. C语言malloc,free的用法

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105163414 C ...

  5. LeetCode 20. 有效的括号 golang(三)

    20. 有效的括号 这个题做了三次,前两次的解法现在觉得是算不得正确的. 看的多写得少 做的多总结少 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有 ...

  6. C语言佛,佛大c语言毕业前补考.doc

    佛大c语言毕业前补考 46题18分,47题10分,48题12分.49-53填空题3分,红色字答案.其他1分.答案基本都是正确的,祝好运! 1.表示关系x<=y<=z的c语言表达式为( C ...

  7. 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...

  8. 算法训练Day11 | LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    目录 LeetCode232.用栈实现队列 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode225. 用队列实现栈 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 ...

  9. c语言switch逻辑用语,C语言习题(前五章)参考答案.doc

    C语言习题(前五章)参考答案.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...

最新文章

  1. 卷积神经网络CNN与深度学习常用框架的介绍与使用
  2. 一天搞定HTML----列表标签03
  3. [转].Net实现本地化简易教程
  4. IOS之学习笔记四(类的实现和对象和id)
  5. 4-1 AlexNet神经网络
  6. phpcmsV9 QQ登录问题分析 - 踩坑篇
  7. 天才?骗子?解析Deep Tech
  8. 冒泡排序和选择排序的实现与比较
  9. 页面自适应纯CSS,使用rem单位
  10. linux 安装adobe字体,Adobe Creative Cloud应用程序已更新,为iOS 13和iPadOS提供免费的自定义字体...
  11. iPhone12 系列机型详细配置对比,iPhone 12mini\12\12Pro\12ProMax
  12. 用.NET做动态域名解析
  13. 寒门再难出贵子(好好看一下,有很大收货的)
  14. android 优化侧滑按钮,Android 界面侧滑
  15. 微信收钱的盒子服务器老是断开,微信文件已过期或被清理的终极解决办法
  16. 贴片铝电容识别及型号_TDK贴片电容识别方法及命名规则
  17. 类似婚礼纪的Java项目_「婚礼纪」婚礼纪 java面试 - seo实验室
  18. 10周成为数据分析师!
  19. 敬业福!2023官方集福攻略
  20. 腾讯第一批开发工程师徐钢武回忆道【曾几何时我真的认为代码是这样的】

热门文章

  1. linux 运行库 编译参数,Linux/CentOS 升级C基本运行库CLIBC的注意事项(当想解决GLIBC_2.x找不到的编译问题)...
  2. Redis和MySQL的结合方案
  3. 三.Python函数
  4. 阿里巴巴在ITU-T成功立项数据安全相关标准
  5. SpringBoot加载静态资源
  6. 数值保留小数点两位,但同时去除小数点后多余0 的 javascript、java实现
  7. 网站防盗链的配置之apache
  8. 1503171912-ny-一道水题
  9. ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用
  10. Pixazza把每张图片自动变成广告赚钱