20. 有效的括号(LeetCode)——C语言及JS实现
Posted 阿料
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
以上是关于20. 有效的括号(LeetCode)——C语言及JS实现的主要内容,如果未能解决你的问题,请参考以下文章