renrenche-fe / everything-about-front-end

探讨所有前端相关的知识点
MIT License
10 stars 0 forks source link

javascript 有效括号 #19

Open keer3 opened 6 years ago

keer3 commented 6 years ago

编写一个函数,并确定括号(包括大括号与小括号)的顺序和组合是否有效。 如果字符串有效,函数应该返回true,如果无效则返回false。 字符串长度大于0。

"()"              =>  true
"("               =>  false
")("              =>  false
")(()))"          =>  false
"(())((()())())"  =>  true
"(({}))((({})({}))())"  =>  true
"(({}))((({)}({}))())"  =>  false
yinkaihui commented 6 years ago
function isValid(str) {
  const stack = []
  const parentheses = str.split('')

  for (let i = 0; i < parentheses.length; i++) {
    const x = parentheses[i]

    switch (x) {
      case '{':
      case '(':
        stack.push(x)
        break
      case ')':
        if (stack.pop() !== '(') {
          return false
        }
        break;
      case '}':
        if (stack.pop() !== '{') {
          return false
        }
        break;
    }
  }
  if (stack.length) {
    return false
  }
  return true
}
sunhengzhe commented 6 years ago
function match(str) {
    const stack = [];
    for (let char of str) {
        if (char === '(' || char === '{') {
            stack.push(char);
        } else if (char === ')' && stack.pop() !== '(') {
            return false;
        } else if (char === '}' && stack.pop() !== '{') {
            return false;
        }
    }

    return stack.length === 0;
}
ilezhi commented 6 years ago
function isOk(str) {
        let obj = {
          '(': ')',
          '{': '}'
        }
        let arr = str.split('').reduce((a, b, i) => {
          let len = a.length;
          let left = a[len - 1];
          if (obj[left] === b) {
            let p = a.pop()
          } else {
            a.push(b)
          }
          return a;
        }, [])

        return !arr.length;
      }
ThoughtZer commented 6 years ago

function checkStr(str) {
  let length = str.length
  if (length === 0 || length % 2 !== 0) {
    return false
  }
  let slcount = 0
  let srcount = 0
  let blcount = 0
  let brcount = 0
  for(let i = 0; i < length; i++) {
    switch(str[i]) {
      case '(':
        slcount ++ 
        break
      case ')':
        srcount ++
        break
      case '}':
        blcount ++
        break
      case '{':
        brcount ++
        break
    }
  }
  if(slcount !== srcount || blcount !== brcount) {
    return false
  }
  let reg = /^(\)|\})|(\(|\{)$/g
  if(reg.test(str)) {
    return false
  }
  if(str.indexOf('{)')>-1 || str.indexOf('(}')>-1) {
    return false
  }
  return true
}
rutingjin commented 6 years ago
function isVaild(){
    let args = Array.prototype.slice.call(arguments),
        previous = args[0],
        need_check_string = args[1] ? args[1] : args[0]
    need_check_string = need_check_string.replace(/\(\)/g,'').replace(/{}/g,'')
    if(!need_check_string) return true
    if(previous === need_check_string) return false
    previous = need_check_string
    return isVaild(previous,need_check_string)
}
let TestArray = ["()" ,"(",")(" ,")(()))","(())((()())())","(({}))((({})({}))())","(({}))((({)}({}))())"]
TestArray.forEach(t => console.log(t.padEnd(30,' ') + `==>      ${isVaild(t)}`))
YataoZhang commented 6 years ago
function V1(input) {
    function calc(str) {
        let s = str.replace(/(\(\))|(\{\})/g, '');
        if (!s) {
            return true;
        }
        if (str.length === s.length) {
            return false;
        }
        return calc(s);
    }
    return calc(input);
}