JS括号匹配问题
在codewars上做了一道括号匹配的题目。
题目
判断字符串中的{}、[]、()三种括号是否匹配,需要考虑嵌套的情况。
例子:
validBraces("(){}[]") // true validBraces("(}") // false validBraces("[(])") // false validBraces("([{}])") // true
Solution
这个问题的最根本只有两种情况,一种是并列的,即没有嵌套的情况,如()[]{};另一种情况就是嵌套的情况,如{[()]}。第一种情况是比较简单的,有难度的是第二种情况。存在嵌套的情况的解决方法,是首先匹配最里面的括号对,即我们常说的从内部开始瓦解。
第一种方法:
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,则匹配,否则,比匹配。
我们同样以{[()]}为例,前三项,即{、[、(入栈,当遍历到)的时候,位于栈顶的'('后出栈与)比较,看是否匹配。后面的]、}也是一样道理。
结语
现在渐渐发现,数据结构和正则表达式非常重要(这里的解决方法就分别用到了),虽然平时用得少,到一道有应用场景,你就会发现数据结构和正则表达式的强大了。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Des questions et des solutions fréquemment posées pour l'impression de billets thermiques frontaux pour le développement frontal, l'impression de billets est une exigence commune. Cependant, de nombreux développeurs mettent en œuvre ...

Il n'y a pas de salaire absolu pour les développeurs Python et JavaScript, selon les compétences et les besoins de l'industrie. 1. Python peut être davantage payé en science des données et en apprentissage automatique. 2. JavaScript a une grande demande dans le développement frontal et complet, et son salaire est également considérable. 3. Les facteurs d'influence comprennent l'expérience, la localisation géographique, la taille de l'entreprise et les compétences spécifiques.

JavaScript est la pierre angulaire du développement Web moderne, et ses principales fonctions incluent la programmation axée sur les événements, la génération de contenu dynamique et la programmation asynchrone. 1) La programmation axée sur les événements permet aux pages Web de changer dynamiquement en fonction des opérations utilisateur. 2) La génération de contenu dynamique permet d'ajuster le contenu de la page en fonction des conditions. 3) La programmation asynchrone garantit que l'interface utilisateur n'est pas bloquée. JavaScript est largement utilisé dans l'interaction Web, les applications à une page et le développement côté serveur, améliorant considérablement la flexibilité de l'expérience utilisateur et du développement multiplateforme.

Comment fusionner les éléments du tableau avec le même ID dans un seul objet en JavaScript? Lors du traitement des données, nous rencontrons souvent la nécessité d'avoir le même ID ...

La discussion sur la réalisation des effets de défilement de parallaxe et d'animation des éléments dans cet article explorera comment réaliser le site officiel de Shiseido (https://www.shiseido.co.jp/sb/wonderland/) ...

Apprendre JavaScript n'est pas difficile, mais c'est difficile. 1) Comprendre les concepts de base tels que les variables, les types de données, les fonctions, etc. 2) Master la programmation asynchrone et les implémenter via des boucles d'événements. 3) Utilisez les opérations DOM et promettez de gérer les demandes asynchrones. 4) Évitez les erreurs courantes et utilisez des techniques de débogage. 5) Optimiser les performances et suivre les meilleures pratiques.

Discussion approfondie des causes profondes de la différence de sortie Console.log. Cet article analysera les différences dans les résultats de sortie de la fonction Console.log dans un morceau de code et expliquera les raisons derrière. � ...

Explorez la mise en œuvre de la fonction de glisser et de réglage du panneau de type VScode dans le frontal. Dans le développement frontal, comment implémenter un VScode comme ...
