这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
大家好今天给大家分享下一道 LeetCode 简单难度 的题目有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
题目
示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 示例 4: 输入:s = "([)]" 输出:false 示例 5: 输入:s = "{[]}" 输出:true
分析
1.匹配的括号必须是相同类型
2.左括号必须一正确的顺序闭合
3.成对的匹配
4.返回true or falses
解法
1.stack
2.includes
解法一:stack
思路
1.利用array 模拟stack
2.建立一个字典dic来匹配对应的括号
3.因为括号需要正向的所以 一旦遇到 } ] )且stack数组为空 则表示违法
4.如果遇到了任意一个 } ] )则对比stack的顶层元素 不符合那也返回为false,
符合则stack.pop 排除最末尾的那个
5.循环结束后 看stack 是否为空 空则返回ture 反之返回false
*/
var isValid = function (s) {
// 创建字典
const dic = {
"{": "}",
"[": "]",
"(": ")",
};
const keys = Object.keys(dic);
const strArr = s.split("");
const stack = [];
for (let i = 0; i < strArr.length; i++) {
const element = strArr[i];
// 因为括号需要正向的所以 一旦遇到 } ] )且stack数组为空 则表示违法
if (!stack.length && !keys.includes(element)) {
return false;
}
// 如果匹配dic的key说明是左边的括号 放入stack顶部
if (keys.includes(element)) {
stack.push(element);
} else {
// 匹配顶部元素
const matchItem = dic[stack.pop()];
// 不成功则返回false
if (matchItem !== element) {
return false;
}
}
}
// 循环结束后 看stack 是否为空 空则返回ture 反之返回false
return stack.length > 0 ? false : true;
};
/* 复杂度
时间 最大为O(n) 最小为O(1)
空间 最大为O(n/2) 最小为O(1)
*/
解法二:includes
思路借鉴 https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-java-by-td0gn7z2gp/
思路
1.迭代字符串,如果包括{} () [] 则替换为空
2.迭代完成 如果s 为空 则返回true,反之返回false
*/
var isValid = function (s) {
while (s.includes("()") || s.includes("{}") || s.includes("[]")) {
s = s.replace("()", "");
s = s.replace("[]", "");
s = s.replace("{}", "");
}
return s === "" ? true : false;
};
/* 复杂度
时间 O(n^2)
空间 O(1)
*/
总结
这道题主要考察的是对stack的应用
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com