美文网首页leetcode --- js版本程序员
leetcode-Easy-第6期-Valid Parenthe

leetcode-Easy-第6期-Valid Parenthe

作者: 石头说钱 | 来源:发表于2019-03-02 11:47 被阅读13次

题目:有效的括号

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
1 Open brackets must be closed by the same type of brackets.
2 Open brackets must be closed in the correct order.

  • Example1
Input: "()"
Output: true

  • Example2
Input: "()[]{}"
Output: true

  • Example3
Input: "(]"
Output: false

  • Example4
Input: "([)]"
Output: false

  • Example5
Input: "{[]}"
Output: true

Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.

  • 解法思路
要想满足题意,那么其实括号的分布只会出现两种方式:
1 相应的括号一对一对挨着出现:
(){}[]
2 左边全是开括号,右边全是闭合括号:
( ( { [ ] } ) ) 

二者的规律:第一个闭合括号出现的时候,那么其左边的那个括号必然是其对应的开括号

  • 解法
var isValid = function(s) {
  let arr = [];
let obj = {
    ']': '[',
    '}': '{',
    ')': '('
}
let strArr = s.split("");

for(let elem of strArr) {
  // 将所有元素依次入栈
    arr.push(elem);
    //如果此时的元素为闭合括号
    if(elem === ']' || elem === '}' || elem === ')') {
        //将已经通过arr.push(item)放在数组末尾的右闭合括号删除
        arr.pop();
        //arr.pop()已经将数组末尾的闭括号删除掉
        //由思路知,满足题意的话,此时数组的最后一个元素必然是与删除掉的闭括号对应的开括号,
      // 如果是就删除掉了一对匹配的开闭括号,程序继续执行,不然就不符合题意return false
        if(arr.pop() != obj[elem]) return false //这里再次执行了arr.pop()
    }

    //如果符合题意,数组arr中成对的括号都会删除掉,长度为0
    return arr.length == 0 ? true : false;
}
  • 以情况一:(){}[]为例
var arr = [  ]
arr = ['('] //arr.push()
arr =  [ '(', ')' ] // arr.push
arr = ['('] // arr.pop()
arr = [] //arr.pop()
arr = ['{']
arr = [ '{',  '}' ], 
arr = ['{']
arr = []

复习Map

Es6的一种数据结构,可以用变量充当key,而传统的对象只能用字符串当作key

var map = new Map([ ['age',13],['name','zs']])
map.get('age‘) //13


const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

for of 与for in区别

  • for of
1、for of遍历的是具有 Iterator 接口的值,
2 不会遍历原型上的值
3 可以通过break推出循环
for(let key of arr){
  console.log(key)
}
//12 4
  • for in
1 可以遍历的有: 对象 数组 字符串 argument对象
2 遍历的都是其对应的key
3 其原型上的也会被遍历(hasOwnProperty解决)
4、for in 遍历的是对象可枚举的属性(key)
5 遍历顺序可能不按照实际数组顺序

(function() {
  for (let key in arguments) {
    console.log(key+':' + arguments[key]);
  }
})('a', 'b');
//输出 0:a 1:b

var arr = [12,4]
arr.age = 55
for(let key in arr){
  console.log(key)
}
// 12 4 age


  • 具有Iterator接口的数据
Array

Map: 
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
for (let entry of iterable) {
  console.log(entry);
}
// ["a", 1]
// ["b", 2]
// ["c", 3]
Set 

String 函数的argument对象 
(function() {
  for (let argument of arguments) {
    console.log(argument);
  }
})(1, 2, 3);
//1 2 3

NodeList对象

注意对象是没有Iterator接口的
var obj = {age:13} //不可以用for of遍历

```

相关文章

网友评论

    本文标题:leetcode-Easy-第6期-Valid Parenthe

    本文链接:https://www.haomeiwen.com/subject/yjksuqtx.html