给定一个表示代码片段的字符串,你需要实现一个验证器来解析这段代码,并返回它是否合法。合法的代码片段需要遵守以下的所有规则:

  1. 代码必须被合法的闭合标签包围。否则,代码是无效的。
  2. 闭合标签(不一定合法)要严格符合格式:<TAG_NAME>TAG_CONTENT</TAG_NAME>。其中,<TAG_NAME>是起始标签,</TAG_NAME>是结束标签。起始和结束标签中的 TAG_NAME 应当相同。当且仅当 TAG_NAME 和 TAG_CONTENT 都是合法的,闭合标签才是合法的
  3. 合法的 TAG_NAME 仅含有大写字母,长度在范围 [1,9] 之间。否则,该 TAG_NAME 是不合法的
  4. 合法的 TAG_CONTENT 可以包含其他合法的闭合标签cdata (请参考规则7)和任意字符(注意参考规则1)除了不匹配的<、不匹配的起始和结束标签、不匹配的或带有不合法 TAG_NAME 的闭合标签。否则,TAG_CONTENT 是不合法的
  5. 一个起始标签,如果没有具有相同 TAG_NAME 的结束标签与之匹配,是不合法的。反之亦然。不过,你也需要考虑标签嵌套的问题。
  6. 一个<,如果你找不到一个后续的>与之匹配,是不合法的。并且当你找到一个<</时,所有直到下一个>的前的字符,都应当被解析为 TAG_NAME(不一定合法)。
  7. cdata 有如下格式:<![CDATA[CDATA_CONTENT]]>CDATA_CONTENT 的范围被定义成 <![CDATA[ 和后续的第一个 ]]>之间的字符。
  8. CDATA_CONTENT 可以包含任意字符。cdata 的功能是阻止验证器解析CDATA_CONTENT,所以即使其中有一些字符可以被解析为标签(无论合法还是不合法),也应该将它们视为常规字符

合法代码的例子:

输入: "<DIV>This is the first line <![CDATA[<div>]]></DIV>"输出: True解释:
代码被包含在了闭合的标签内: <DIV> 和 </DIV> 。
TAG_NAME 是合法的,TAG_CONTENT 包含了一些字符和 cdata 。
即使 CDATA_CONTENT 含有不匹配的起始标签和不合法的 TAG_NAME,它应该被视为普通的文本,而不是标签。
所以 TAG_CONTENT 是合法的,因此代码是合法的。最终返回True。
输入: "<DIV>>>  ![cdata[]] <![CDATA[<div>]>]]>]]>>]</DIV>"
输出: True
解释:
我们首先将代码分割为: start_tag|tag_content|end_tag 。
start_tag -> "<DIV>"
end_tag -> "</DIV>"
tag_content 也可被分割为: text1|cdata|text2 。
text1 -> ">>  ![cdata[]] "
cdata -> "<![CDATA[<div>]>]]>" ,其中 CDATA_CONTENT 为 "<div>]>"
text2 -> "]]>>]"
start_tag "<DIV>>>" 的原因参照规则 6 。
cdata "<![CDATA[<div>]>]]>]]>" 的原因参照规则 7 。
不合法代码的例子:
输入: "<A>  <B> </A>   </B>"
输出: False
解释: 不合法。如果 "<A>" 是闭合的,那么 "<B>" 一定是不匹配的,反之亦然。
输入: "<DIV>  div tag is not closed  <DIV>"
输出: False
输入: "<DIV>  unmatched <  </DIV>"
输出: False
输入: "<DIV> closed tags with invalid tag name  <b>123</b> </DIV>"
输出: False
输入: "<DIV> unmatched tags with invalid tag name  </1234567890> and <CDATA[[]]>  </DIV>"
输出: False
输入: "<DIV>  unmatched start tag <B>  and unmatched end tag </C>  </DIV>"
输出: False

注意:

  1. 为简明起见,你可以假设输入的代码(包括提到的任意字符)只包含数字, 字母, '<','>','/','!','[',']'' '

在真实的面试中遇到过这道题?

class Solution {
public:
    bool isValid(string code) {
        stack<string> st;
        for (int i = 0; i < code.size(); ++i) {
            if (i > 0 && st.empty()) return false;
            if (code.substr(i, 9) == "<![CDATA[") {
                int j = i + 9;
                i = code.find("]]>", j);
                if (i < 0) return false;
                i += 2;
            } else if (code.substr(i, 2) == "</") {
                int j = i + 2;
                i = code.find(">", j);
                if (i < 0) return false;
                string tag = code.substr(j, i - j);
                if (st.empty() || st.top() != tag) return false;
                st.pop();
            } else if (code.substr(i, 1) == "<") {
                int j = i + 1;
                i = code.find(">", j);
                if (i < 0 || i == j || i - j > 9) return false;
                for (int k = j; k < i; ++k) {
                    if (code[k] < 'A' || code[k] > 'Z') return false;
                }
                string tag = code.substr(j, i - j);
                st.push(tag);
            }
        }
        return st.empty();
    }
};

591. 标签验证器相关推荐

  1. 原生JS 表单提交验证器

    一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过"缜密"的讨论后,我们决定 不用外部流行的框架,如bootstrap,由于我负责的模块 仅仅是其中的一部分, ...

  2. jsf表单验证_JSF验证示例教程–验证器标签,定制验证器

    jsf表单验证 JSF validation model defines a set of standard classes for validating the UI components. The ...

  3. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

  4. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  5. 【Android Developers Training】 93. 创建一个空验证器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. Struts Validator验证器使用指南

    作者: David Winterfeldt大卫 James Turner詹姆斯 Rob Leland罗伯特 翻译: 侯思超 验证器: 从0.5版,验证器在一些form中就已经实现了,他最初包含在开发人 ...

  7. Spring MVC Hibernate验证器使用示例

    下面的示例演示如何使用Spring Web MVC框架在表单中使用错误处理和验证器. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web ...

  8. jsf 自定义属性_必填字段的自定义JSF验证器

    jsf 自定义属性 实现EditableValueHolder接口的JSF组件具有两个属性" required"和" requiredMessage" –一个标 ...

  9. jsf 传参数_在JSF 2中对定制验证器进行参数化

    jsf 传参数 在JSF 2中编写自定义验证器并不是一项复杂的任务. 您实现Validator接口,添加@FacesValidator批注,并在faces-config.xml中插入validator ...

  10. 必填字段的自定义JSF验证器

    实现EditableValueHolder接口的JSF组件具有两个属性" required"和" requiredMessage" –一个标志,指示用户需要输入 ...

最新文章

  1. 本科发表6篇SCI论文,获多个荣誉,他刚入学就享受研究生待遇!
  2. Mysql Replication 机制
  3. 嵌入式linux 配置usb otg,嵌入式系统设计中的USB OTG方案
  4. java打星星_java实现星星图形的输出
  5. java 生成器 设计模式_Java中的生成器设计模式
  6. 【牛客 - 315B】 勇气获得机(二叉树性质,思维,知识点,tricks)
  7. 怎么把php查询到的值显示到下拉框中_RazorSQL for Mac(数据库工具查询) v8.5.0
  8. python字符串_教你快速了解 Python 字符串
  9. 09-1.部署 coredns 插件
  10. app营销实训报告_市场营销模拟软件实训报告
  11. 黑色星期五移动购物销售额iOS设备占逾80%
  12. 记一次失败的git截图工具使用经历——shareX
  13. golang 脚本卡住
  14. 学历焦虑正在摧毁新一代测试工程师!学历不够如何破局?
  15. 浏览器有新消息之后,图标在电脑任务栏闪烁提示
  16. Processing摸索前行(9)-音频可视化
  17. SQLserver数据库教程
  18. UG NX 10.0 GRIP 二次开发
  19. 莫烦Python教程之Pandas教程
  20. win7开机登录界面的壁纸怎样更换修改

热门文章

  1. 3图片尺寸要求_贵港200L塑料桶图片尺寸
  2. display可以控制标签的显示模式
  3. IIS 6.0 不能处理未知的 MIME 类
  4. 利用hasOwnProperty实现的高效的javascript hashtable
  5. 关于Quartz 2D绘图的简单使用
  6. Firefox 火狐恢复下载失败的任务(原创)
  7. MyBatis-SELECT基本查询
  8. 【转】保证训练集和测试集取到和数据集中相同比例的类别
  9. ubuntu 安装ssh 服务
  10. win下的一款自动远程备份工具