摘要:在上做了一道括號匹配的題目。題目判斷字符串中的三種括號是否匹配,需要考慮嵌套的情況。是,則表示完全匹配,否則,比匹配。
在codewars上做了一道括號匹配的題目。
題目判斷字符串中的{}、[]、()三種括號是否匹配,需要考慮嵌套的情況。
例子:
validBraces("(){}[]") // true validBraces("(}") // false validBraces("[(])") // false validBraces("([{}])") // trueSolution
這個問題的最根本只有兩種情況,一種是并列的,即沒有嵌套的情況,如()[]{};另一種情況就是嵌套的情況,如{[()]}。第一種情況是比較簡單的,有難度的是第二種情況。存在嵌套的情況的解決方法,是首先匹配最里面的括號對,即我們常說的從內部開始瓦解。
第一種方法:
function validBraces(braces){ while(/()|[]|{}/g.test(braces)){ braces = braces.replace(/()|[]|{}/g,"") } return !braces.length; }
這種方法,查找成對的括號,然后將成對相鄰的括號替換成空字符串,也就是說刪除。最后判斷字符串的長度是否為0。是,則表示完全匹配,否則,比匹配。
其實,這種方案就是典型的“從內部開始瓦解”。我們以{[()]}為例,你觀察一下,現在只有最里面的()才是成對且相鄰的,當把()替換成空字符串之后,[]變成了成對且相鄰的,然后再將其替換成空字符串。就這樣一直循環地查找,直到再也找不到成對且相鄰的括號為止。
第二種方法:
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 }
這種方法,是將左半邊括號,即(、[、{存入棧stack中,當遍歷到右半邊括號,即)、]、}的時候,stack執行出棧操作,然后將出棧的左半邊括號與遍歷到的有半邊括號匹配,看是否為與其相匹配的另半邊括號。如果遍歷完了,則判斷棧的長度,為0,則匹配,否則,比匹配。
我們同樣以{[()]}為例,前三項,即{、[、(入棧,當遍歷到)的時候,位于棧頂的"("后出棧與)比較,看是否匹配。后面的]、}也是一樣道理。
現在漸漸發現,數據結構和正則表達式非常重要(這里的解決方法就分別用到了),雖然平時用得少,到一道有應用場景,你就會發現數據結構和正則表達式的強大了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80675.html
摘要:控制權和傳動這兩個詞可能在搜一些博文或者資料的時候會遇到,這里做一個解釋先控制權是指哪一個正則子表達式可能為一個普通字符元字符或元字符序列組成在匹配字符串,那么控制權就在哪。 溫馨提示:文章很長很長,保持耐心,必要時可以跳著看,當然用來查也是不錯的。 正則啊,就像一座燈塔,當你在字符串的海洋不知所措的時候,總能給你一點思路;正則啊,就像一臺驗鈔機,在你不知道用戶提交的鈔票真假的時候,...
摘要:正則起源最近看完了精通正則表達式,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實戰和教程部分。然后下面說一下以上兩個基礎教程里沒說到的知識點。最后以上是我在精通正則表達式一書中得到的一些收獲,希望能分享給大家,如有錯誤歡迎指正。 正則起源 最近看完了 《精通正則表達式》,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實戰和教程部分。 下面引用一下百度百科里的內容。 正則表達式的鼻...
摘要:表示非單詞字符,等效于正則教程返回完整的字符串,因為,中文算作是非單詞字符。行首行尾,修飾符形式修飾符的作用是修改和在正則表達式中的作用,讓它們分別表示行首和行尾。 正則 描述 正則 描述 f 匹配換頁符 匹配制表符 匹配換行符 v 匹配垂直制表符 匹配回車 s 匹配單個空格,等同于[f v]; S...
閱讀 3349·2021-09-30 09:47
閱讀 2732·2021-08-18 10:22
閱讀 2518·2021-08-16 10:49
閱讀 2884·2019-08-30 15:53
閱讀 2732·2019-08-29 16:14
閱讀 3185·2019-08-28 18:18
閱讀 3229·2019-08-26 13:21
閱讀 787·2019-08-26 12:02