iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0

今日kata

原始題目如下:(5kyu)
Write a function called that takes a string of parentheses, and determines if the order of the parentheses is valid. The function should return true if the string is valid, and false if it's invalid.

翻譯:
判斷括號是否成雙成對。

範例:

"()"              =>  true
")(()))"          =>  false
"("               =>  false
"(())((()())())"  =>  true

構想&解法

function validParentheses(parens){
  let pair={
    ')':'(',  
    }
  let stack=[]

  for(let i=0 ; i<parens.length;i++){
      stack.length===0?
      stack.push(parens[i]):stack[stack.length-1]===pair[parens[i]]?stack.pop():stack.push(parens[i])
  }
  return stack.length===0?true:false
}

和先前的Valid Braces或是Directions Reduction是一樣的概念,可見這類型題目多多多重要(?)/images/emoticon/emoticon02.gif

一樣是stack先進後出的概念,宣告一stack陣列,一一遍歷parens中的元素

  • 如果stack為空,將目前parens[i]放入stack
  • 如果stack不為空,判斷目前stack最後一個元素和parens[i]是否成對
    • 若為一對,移除目前stack最後一個元素
    • 若不成一對,將目前parens[i]放入stack

最後看stack有無元素,就知道括號結果是成雙成對還是落單(?)


其他解法觀摩

function validParentheses(parens){
  var re = /\(\)/;
  while (re.test(parens)) parens = parens.replace(re, "");
  return !parens;
}

有用到之前Directions Reduction整理到的正規表示式Method,while搭配 regexp.test()
parens()出現,就進行替換!


function validParentheses(parens){
  var n = 0;
  for (var i = 0; i < parens.length; i++) {
    if (parens[i] == '(') n++;
    if (parens[i] == ')') n--;
    if (n < 0) return false;
  }
  
  return n == 0;
}

(加1;)減一的概念,一一遍歷parens中的元素,使用n來計量,每次n變動完,都check目前的n是否為正。

以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。


上一篇
Directions Reduction
下一篇
Consecutive strings
系列文
菜鳥工程師的奇幻漂流:跟著kata活化手指和意識30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言