#591

Tag Validator

master · 1760 · lc hard +32 · verified · 40.3% accepted · 181 likes · top 20%

play →

Description

Validate a code snippet string according to these rules:

- The entire snippet must be enclosed in a single valid closed tag of the form <TAG_NAME>TAG_CONTENT</TAG_NAME>, where both tag names must match.

- A valid TAG_NAME contains only uppercase letters and has a length between 1 and 9.

- Valid TAG_CONTENT may include other valid closed tags, CDATA sections, and arbitrary characters — but no unmatched <, no mismatched tags, and no tags with invalid names.

- Any < without a following > is considered unmatched. Everything from < (or </) up to the next > is treated as a tag name (even if invalid).

- A CDATA section has the form <![CDATA[CDATA_CONTENT]]>, where CDATA_CONTENT is everything between <![CDATA[ and the first ]]>. CDATA content is always treated as plain text, never parsed.

Example 1:

Input: code = "<DIV>This is the first line <![CDATA[<div>]]></DIV>"
Output: true
Explanation:
The code is wrapped in a closed tag : <DIV> and </DIV>.
The TAG_NAME is valid, the TAG_CONTENT consists of some characters and cdata.
Although CDATA_CONTENT has an unmatched start tag with invalid TAG_NAME, it should be considered as plain text, not parsed as a tag.
So TAG_CONTENT is valid, and then the code is valid. Thus return true.

Example 2:

Input: code = "<DIV>>> ![cdata[]] <![CDATA[<div>]>]]>]]>>]</DIV>"
Output: true
Explanation:
We first separate the code into : start_tag|tag_content|end_tag.
start_tag -> "<DIV>"
end_tag -> "</DIV>"
tag_content could also be separated into : text1|cdata|text2.
text1 -> ">> ![cdata[]] "
cdata -> "<![CDATA[<div>]>]]>", where the CDATA_CONTENT is "<div>]>"
text2 -> "]]>>]"
The reason why start_tag is NOT "<DIV>>>" is because of the rule 6.
The reason why cdata is NOT "<![CDATA[<div>]>]]>]]>" is because of the rule 7.

Example 3:

Input: code = "<A> <B> </A> </B>"
Output: false
Explanation: Unbalanced. If "<A>" is closed, then "<B>" must be unmatched, and vice versa.

Code

1
2
3