成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS括號(hào)匹配問題

lordharrd / 1075人閱讀

摘要:在上做了一道括號(hào)匹配的題目。題目判斷字符串中的三種括號(hào)是否匹配,需要考慮嵌套的情況。是,則表示完全匹配,否則,比匹配。

在codewars上做了一道括號(hào)匹配的題目。

題目

判斷字符串中的{}、[]、()三種括號(hào)是否匹配,需要考慮嵌套的情況。

例子:

validBraces("(){}[]")     // true 
validBraces("(}")         // false 
validBraces("[(])")       // false 
validBraces("([{}])")     // true 
Solution

這個(gè)問題的最根本只有兩種情況,一種是并列的,即沒有嵌套的情況,如()[]{};另一種情況就是嵌套的情況,如{[()]}。第一種情況是比較簡單的,有難度的是第二種情況。存在嵌套的情況的解決方法,是首先匹配最里面的括號(hào)對(duì),即我們常說的從內(nèi)部開始瓦解。

第一種方法:

function validBraces(braces){
  while(/()|[]|{}/g.test(braces)){
    braces = braces.replace(/()|[]|{}/g,"")
  }
  return !braces.length;
}

這種方法,查找成對(duì)的括號(hào),然后將成對(duì)相鄰的括號(hào)替換成空字符串,也就是說刪除。最后判斷字符串的長度是否為0。是,則表示完全匹配,否則,比匹配。
其實(shí),這種方案就是典型的“從內(nèi)部開始瓦解”。我們以{[()]}為例,你觀察一下,現(xiàn)在只有最里面的()才是成對(duì)且相鄰的,當(dāng)把()替換成空字符串之后,[]變成了成對(duì)且相鄰的,然后再將其替換成空字符串。就這樣一直循環(huán)地查找,直到再也找不到成對(duì)且相鄰的括號(hào)為止。

第二種方法:

function validBraces(braces){
  let leftBraReg = /[({[]/, 
    // 棧
      stack = [],
      bracket, rightBracket
  braces = braces.split("")
  for(bracket of braces) {
    if(leftBraReg.test(bracket)) {
      stack.push(bracket)
    }
    else {
      switch (bracket) {
          case ")":
          rightBracket = stack.pop()
          if(rightBracket !=="(") {
              return false
          }
          break
        case "]":
          rightBracket = stack.pop()
          if(rightBracket !=="[") {
              return false
          }
          break
        case "}":
          rightBracket = stack.pop()
          if(rightBracket !=="{") {
              return false
          }
          break
      }
    }
  }
  return stack.length === 0 ? true : false
}

這種方法,是將左半邊括號(hào),即(、[、{存入棧stack中,當(dāng)遍歷到右半邊括號(hào),即)、]、}的時(shí)候,stack執(zhí)行出棧操作,然后將出棧的左半邊括號(hào)與遍歷到的有半邊括號(hào)匹配,看是否為與其相匹配的另半邊括號(hào)。如果遍歷完了,則判斷棧的長度,為0,則匹配,否則,比匹配。
我們同樣以{[()]}為例,前三項(xiàng),即{、[、(入棧,當(dāng)遍歷到)的時(shí)候,位于棧頂?shù)?("后出棧與)比較,看是否匹配。后面的]、}也是一樣道理。

結(jié)語

現(xiàn)在漸漸發(fā)現(xiàn),數(shù)據(jù)結(jié)構(gòu)和正則表達(dá)式非常重要(這里的解決方法就分別用到了),雖然平時(shí)用得少,到一道有應(yīng)用場(chǎng)景,你就會(huì)發(fā)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和正則表達(dá)式的強(qiáng)大了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80675.html

相關(guān)文章

  • JS正則表達(dá)式一條龍講解,從原理和語法到JS正則、ES6正則擴(kuò)展,最后再到正則實(shí)踐思路

    摘要:控制權(quán)和傳動(dòng)這兩個(gè)詞可能在搜一些博文或者資料的時(shí)候會(huì)遇到,這里做一個(gè)解釋先控制權(quán)是指哪一個(gè)正則子表達(dá)式可能為一個(gè)普通字符元字符或元字符序列組成在匹配字符串,那么控制權(quán)就在哪。 溫馨提示:文章很長很長,保持耐心,必要時(shí)可以跳著看,當(dāng)然用來查也是不錯(cuò)的。 正則啊,就像一座燈塔,當(dāng)你在字符串的海洋不知所措的時(shí)候,總能給你一點(diǎn)思路;正則啊,就像一臺(tái)驗(yàn)鈔機(jī),在你不知道用戶提交的鈔票真假的時(shí)候,...

    Michael_Lin 評(píng)論0 收藏0
  • 正則之基本入門

    摘要:忽略大小寫全文查找出現(xiàn)的所有匹配字符多行查找全文查找忽略大小寫所以使用之后可以這樣寫表示忽略大小寫匹配或者正式入門正則正則其實(shí)就是用來匹配字符串的。惰性量詞使用方法基本量詞該量詞和貪婪量詞就像,一個(gè)是消極怠工,一個(gè)是積極工作。 以前看了許許多多的正則教程,收貨并不多,往往都是蜻蜓點(diǎn)水,一點(diǎn)就過。事實(shí)上,正則用處真的超級(jí)大,比如匹配innerHTML的內(nèi)容,以及表單驗(yàn)證,也是非他莫屬。這...

    ormsf 評(píng)論0 收藏0
  • 讀《精通正則表達(dá)式》-- 網(wǎng)上 js 正則基礎(chǔ)教程沒有涉及的一些知識(shí)

    摘要:正則起源最近看完了精通正則表達(dá)式,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實(shí)戰(zhàn)和教程部分。然后下面說一下以上兩個(gè)基礎(chǔ)教程里沒說到的知識(shí)點(diǎn)。最后以上是我在精通正則表達(dá)式一書中得到的一些收獲,希望能分享給大家,如有錯(cuò)誤歡迎指正。 正則起源 最近看完了 《精通正則表達(dá)式》,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實(shí)戰(zhàn)和教程部分。 下面引用一下百度百科里的內(nèi)容。 正則表達(dá)式的鼻...

    GT 評(píng)論0 收藏0
  • JS正則表達(dá)式元字符

    摘要:表示非單詞字符,等效于正則教程返回完整的字符串,因?yàn)?,中文算作是非單詞字符。行首行尾,修飾符形式修飾符的作用是修改和在正則表達(dá)式中的作用,讓它們分別表示行首和行尾。 正則 描述 正則 描述 f 匹配換頁符 匹配制表符 匹配換行符 v 匹配垂直制表符 匹配回車 s 匹配單個(gè)空格,等同于[f v]; S...

    CODING 評(píng)論0 收藏0
  • 正則表達(dá)式

    摘要:正則表達(dá)式產(chǎn)生回溯的地方貪婪量詞前面的匹配的是,后面的匹配的是惰性量詞惰 查看原文站點(diǎn),更多擴(kuò)展內(nèi)容及更佳閱讀體驗(yàn)!查看原文:正則表達(dá)式 正則表達(dá)式 正則表達(dá)式是匹配模式,要么匹配字符,要么匹配位置。 字符匹配 兩種模糊匹配 正則表達(dá)式能實(shí)現(xiàn)模糊匹配 模糊匹配,有兩個(gè)方向上的模糊:橫向和縱向 橫向模糊匹配 橫向模糊指的是,一個(gè)正則可匹配的字符串的長度不是固定的 實(shí)現(xiàn)方式是使用...

    Dean 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<