LeetCode第20题:有效的括号
1.题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。 2.左括号必须以正确的顺序闭合。
- 注:空字符也为有效字符哦(空对空也是一组)
示例:
输入:'()'
输出:ture
输入:'([{}])'
输出:ture
输入:'{}])'
输出:false
输入:'([)]'
输出:false
输入:'([{()})]'
输出:false
2.解题思路
题目意思是给定一串括号的字符,要你判断该字符串中的括号闭合顺序是否一样和顺序是否正确。
我们可以把该字符串拆分成两部分,一部分是左边的括号,一部分是右边的括号。
首先,我们来分析一下特殊情况。
第一,肯定是当这个字符串是空时,应该返回ture
第二,如果该字符串不对称,那肯定返回false
然后,我们会想怎么让字符串中的这些括号进行匹配
那这里就要用到我们的栈了。
栈是一种特殊的字符串,它里面的元素是‘先进后出’。为了方便理解,看下图
- 实现过程: 1.初始化一个栈stack, 2.用for循环把字符串遍历出来放入新数组中,并且找出左括号的字符把它放进栈中,此时字符串中只剩下右括号了。 3.我们把栈里的元素取出来去比较右括号,如果没有匹配的就返回false 要注意两种情况:1.当字符串像'{}])' 这时我们会发现当循环一次后,第二次循环栈里已经没有元素了,而右括号还有元素。这时我们应该怎么办?所以判断条件我们应该加上当栈的长度不存在返回false 2.当字符串内的括号完全匹配时,像'([{}])' 当循环结束时,过程3是不会执行的,应该返回ture 所以我们在循环体外返回return !stack.length。!0就相当于1 , ture
3.代码实现
由于个人能力有限,暂时只提供JavaScript语言代码实现。只要理解了本算法的思想,你也能用其他语言实现出来,这也是对个人代码能力的锻炼。
/**
* @author 我叫坚强我不哭
* @param {string} s
* @return {boolean}
*/
const leftToRight = {
"(":")",
"{":"}",
"[":"]"
}
var isValid = function(s) {
if (!s) {
return true
}
// 初始化一个stack栈
const stack = []
const len = s.length
for (let i = 0; i < len ;i++) {
// 遇到左括号就入栈
// 否则就将栈里的元素取出来比较
const ch = s[i]
if (ch == "(" || "{" || "["){
stack.push(leftToRight[ch])
}else {
if (!stack.length || stack.pop() !== ch) {
return false
}
}
}
return !stack.length
};
4.总结
一般涉及到对称的话,我们优先考虑用栈来解决。 前期在刷LeetCode时,如果想了一会儿没有思路的话不要死扣,应该果断的去看别人的解题思路。理解了之后,在凭借自己的理解和记忆自己敲一遍。 学习 = 学 + 习。知识是学出来的,不是在自己脑子里蹦出来的;学过之后,还要自己动手练习。新手要勇敢地、经常地学习别人的解法和答案,然后凭理解敲代码练习。只要度过刷题初期的痛苦,后面就会越刷越快。
- 注:这仅是我自己的理解,如果有更好的方法,欢迎大佬们指点。