这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战
前言
作为一个开发人员,我们日常开发的过程中应该都用过格式校验工具,比如我就是用的ESLint,它可以帮我们校验书写的格式是不是正确,比如是不是少了逗号,少了分号,或者是少写了括号,那它是怎么来识别少写了括的呢,俺也不知道,刚好又个算法题是判断是否是有效括号的,我们不妨一起来看看
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
解题思路
- 首先通过观察我们发现,符合条件的括号也就()[]{}这三种情况,那么我们只要判断输入内容中的项是否符合这三个条件就行了
- 首先声明一个数组calculateArr,用来存放左括号,通过for循环来判断每一项是不是左括号,是就存进calculateArr
- 如果不是左括号就拿着这个项和calculateArr.pop()对比,如果是一对括号就继续,如果不是直接return false
- 最后循环解说要判断calculateArr是否为空,为空就返回true,否则返回false,下面来两种方法,代码如下 方法1:
var isValid = function(s) {
let originalArr= s.split('')
let calculateArr=[]
let count=0
for(let i=0;i<originalArr.length;i++){
if(originalArr[i]==='(' || originalArr[i]==='[' ||originalArr[i]==='{'){
calculateArr.push(originalArr[i])
count++
}else if(originalArr[i]===')' && calculateArr[count-1]==='(' || originalArr[i]===']' && calculateArr[count-1]==='[' ||originalArr[i]==='}'&& calculateArr[count-1]==='{'){
calculateArr.pop(originalArr[count-1])
count--
}else{
return false
}
}
if(calculateArr.length){
return false
}else{
return true
}
};
LeetCode运行结果如下:
方法二:
var isValid = function(s) {
let templete = new Map()
templete.set("(",")")
templete.set("[","]")
templete.set("{","}")
let calculate=[]
for(let i=0;i<s.length;i++){
if(templete.has(s[i])){
calculate.push(templete.get(s[i]))
}else{
if(calculate.pop()!==s[i]){
return false
}
}
}
if(calculate.length){
return false
}else{
return true
}
};
LeetCode运行结果如下:
总结
上述的两种方法虽然不同,但是思路都是一样的,都是先明确括号的三种状态,然后对输入的内容进行一项一项的对比,最终得到结果,第二种方法看起来会更简洁一点,而且效率也更高,如有更好的方法,欢迎大家评论指点。