美文网首页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