摘要:在上做了一道括號(hào)匹配的題目。題目判斷字符串中的三種括號(hào)是否匹配,需要考慮嵌套的情況。是,則表示完全匹配,否則,比匹配。
在codewars上做了一道括號(hào)匹配的題目。
題目判斷字符串中的{}、[]、()三種括號(hào)是否匹配,需要考慮嵌套的情況。
例子:
validBraces("(){}[]") // true validBraces("(}") // false validBraces("[(])") // false validBraces("([{}])") // trueSolution
這個(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ù)?("后出棧與)比較,看是否匹配。后面的]、}也是一樣道理。
現(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
摘要:控制權(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í)候,...
摘要:正則起源最近看完了精通正則表達(dá)式,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實(shí)戰(zhàn)和教程部分。然后下面說一下以上兩個(gè)基礎(chǔ)教程里沒說到的知識(shí)點(diǎn)。最后以上是我在精通正則表達(dá)式一書中得到的一些收獲,希望能分享給大家,如有錯(cuò)誤歡迎指正。 正則起源 最近看完了 《精通正則表達(dá)式》,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實(shí)戰(zhàn)和教程部分。 下面引用一下百度百科里的內(nèi)容。 正則表達(dá)式的鼻...
摘要:表示非單詞字符,等效于正則教程返回完整的字符串,因?yàn)?,中文算作是非單詞字符。行首行尾,修飾符形式修飾符的作用是修改和在正則表達(dá)式中的作用,讓它們分別表示行首和行尾。 正則 描述 正則 描述 f 匹配換頁符 匹配制表符 匹配換行符 v 匹配垂直制表符 匹配回車 s 匹配單個(gè)空格,等同于[f v]; S...
摘要:正則表達(dá)式產(chǎn)生回溯的地方貪婪量詞前面的匹配的是,后面的匹配的是惰性量詞惰 查看原文站點(diǎn),更多擴(kuò)展內(nèi)容及更佳閱讀體驗(yàn)!查看原文:正則表達(dá)式 正則表達(dá)式 正則表達(dá)式是匹配模式,要么匹配字符,要么匹配位置。 字符匹配 兩種模糊匹配 正則表達(dá)式能實(shí)現(xiàn)模糊匹配 模糊匹配,有兩個(gè)方向上的模糊:橫向和縱向 橫向模糊匹配 橫向模糊指的是,一個(gè)正則可匹配的字符串的長度不是固定的 實(shí)現(xiàn)方式是使用...
閱讀 3363·2021-09-30 09:47
閱讀 2748·2021-08-18 10:22
閱讀 2533·2021-08-16 10:49
閱讀 2902·2019-08-30 15:53
閱讀 2743·2019-08-29 16:14
閱讀 3195·2019-08-28 18:18
閱讀 3244·2019-08-26 13:21
閱讀 800·2019-08-26 12:02