591. 标签验证器
给定一个表示代码片段的字符串,你需要实现一个验证器来解析这段代码,并返回它是否合法。合法的代码片段需要遵守以下的所有规则:
- 代码必须被合法的闭合标签包围。否则,代码是无效的。
- 闭合标签(不一定合法)要严格符合格式:
<TAG_NAME>TAG_CONTENT</TAG_NAME>
。其中,<TAG_NAME>
是起始标签,</TAG_NAME>
是结束标签。起始和结束标签中的 TAG_NAME 应当相同。当且仅当 TAG_NAME 和 TAG_CONTENT 都是合法的,闭合标签才是合法的。 - 合法的
TAG_NAME
仅含有大写字母,长度在范围 [1,9] 之间。否则,该TAG_NAME
是不合法的。 - 合法的
TAG_CONTENT
可以包含其他合法的闭合标签,cdata (请参考规则7)和任意字符(注意参考规则1)除了不匹配的<
、不匹配的起始和结束标签、不匹配的或带有不合法 TAG_NAME 的闭合标签。否则,TAG_CONTENT
是不合法的。 - 一个起始标签,如果没有具有相同 TAG_NAME 的结束标签与之匹配,是不合法的。反之亦然。不过,你也需要考虑标签嵌套的问题。
- 一个
<
,如果你找不到一个后续的>
与之匹配,是不合法的。并且当你找到一个<
或</
时,所有直到下一个>
的前的字符,都应当被解析为 TAG_NAME(不一定合法)。 - cdata 有如下格式:
<![CDATA[CDATA_CONTENT]]>
。CDATA_CONTENT
的范围被定义成<![CDATA[
和后续的第一个]]>
之间的字符。 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
注意:
- 为简明起见,你可以假设输入的代码(包括提到的任意字符)只包含
数字
, 字母,'<'
,'>'
,'/'
,'!'
,'['
,']'
和' '
。
在真实的面试中遇到过这道题?
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. 标签验证器相关推荐
- 原生JS 表单提交验证器
一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过"缜密"的讨论后,我们决定 不用外部流行的框架,如bootstrap,由于我负责的模块 仅仅是其中的一部分, ...
- jsf表单验证_JSF验证示例教程–验证器标签,定制验证器
jsf表单验证 JSF validation model defines a set of standard classes for validating the UI components. The ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
- [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...
本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...
- 【Android Developers Training】 93. 创建一个空验证器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Struts Validator验证器使用指南
作者: David Winterfeldt大卫 James Turner詹姆斯 Rob Leland罗伯特 翻译: 侯思超 验证器: 从0.5版,验证器在一些form中就已经实现了,他最初包含在开发人 ...
- Spring MVC Hibernate验证器使用示例
下面的示例演示如何使用Spring Web MVC框架在表单中使用错误处理和验证器. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web ...
- jsf 自定义属性_必填字段的自定义JSF验证器
jsf 自定义属性 实现EditableValueHolder接口的JSF组件具有两个属性" required"和" requiredMessage" –一个标 ...
- jsf 传参数_在JSF 2中对定制验证器进行参数化
jsf 传参数 在JSF 2中编写自定义验证器并不是一项复杂的任务. 您实现Validator接口,添加@FacesValidator批注,并在faces-config.xml中插入validator ...
- 必填字段的自定义JSF验证器
实现EditableValueHolder接口的JSF组件具有两个属性" required"和" requiredMessage" –一个标志,指示用户需要输入 ...
最新文章
- 本科发表6篇SCI论文,获多个荣誉,他刚入学就享受研究生待遇!
- Mysql Replication 机制
- 嵌入式linux 配置usb otg,嵌入式系统设计中的USB OTG方案
- java打星星_java实现星星图形的输出
- java 生成器 设计模式_Java中的生成器设计模式
- 【牛客 - 315B】 勇气获得机(二叉树性质,思维,知识点,tricks)
- 怎么把php查询到的值显示到下拉框中_RazorSQL for Mac(数据库工具查询) v8.5.0
- python字符串_教你快速了解 Python 字符串
- 09-1.部署 coredns 插件
- app营销实训报告_市场营销模拟软件实训报告
- 黑色星期五移动购物销售额iOS设备占逾80%
- 记一次失败的git截图工具使用经历——shareX
- golang 脚本卡住
- 学历焦虑正在摧毁新一代测试工程师!学历不够如何破局?
- 浏览器有新消息之后,图标在电脑任务栏闪烁提示
- Processing摸索前行(9)-音频可视化
- SQLserver数据库教程
- UG NX 10.0 GRIP 二次开发
- 莫烦Python教程之Pandas教程
- win7开机登录界面的壁纸怎样更换修改