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

问题描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值