力扣 591.标签验证器

力扣 591.标签验证器

这个题目看到的时候我是崩溃的,一共8个条件,看着密密麻麻的,不过作为学前端的我,这好像是一个HTML的标签验证问题,给大家看几个官网给的例子

原题链接:591. 标签验证器 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/tag-validator/

 

这个题目的意思在我看来就是,首先一定要有开始标签和结束标签。也就是说一定要<A></A>,这是最外层的,而中间不可以有<这个字符,或者说有一个不匹配的开始或者结束标签,比如有<B>但是没有</B>,因为我看过Vue的源码,一下子就想到了当时尤大大写的render函数好像就是这个思路,把template一步步分析,吧节点解析成VNode然后再用diffing算法做对比,我记得尤大大用的是正则表达式,当然我看的是Vue2的源码,我正则不好加上时间有限,所以先没用正则,用最基础的字符串开始写,下面我来写一下我的思路

首先一定是用栈的思路,先进后出,只要遇到一个开始标签就入栈,如果遇到的结束标签和栈顶的开始标签不匹配那么就返回false,于是开始遍历这个栈,那么怎么判断这个是开始标签呢,首先我们会遇到<这个符号,而这个字符会有三种情况,第一种情况是<后面跟的不是/亦或者是!,那么就是一个开始标签的起始,所以我们需要找到和<匹配的最近的>,如果找到了,那么中间的所有字符就是标签名,而标签名需要大写,所以我们再去遍历标签名是否符合,如果都ok那么就入栈,第二种情况是遇到</,那么遇到</也就是结束标签,如果遇到结束标签的话我们一样也需要去找到与之对应的>,找到了</和>,我们就去判断栈顶的开始标签是不是和这个结束标签所匹配,如果不匹配那么就返回false,如果匹配的话那么这个栈顶的元素可以舍去,我们不用去判断这个标签名是否大写,只需要去判断和栈顶的元素是不是一样的即可,那么下面的情况就是<!这个情况了,也一样,我们去找是不是符合<![CDATA[CDATA_CONTENT]]>,这就是我的大致思路了

  

这是我没用正则写的,可能相对于大部分人来说更好理解,一会我会再参考尤大大的render写法再用正则做一手优化~ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值