标签验证器
难度:
标签:
题目描述
代码结果
运行时间: 28 ms, 内存: 16.2 MB
/*
题目思路:
1. 使用Java Stream流来处理字符串的拆分与匹配检查。
2. 分别处理起始标签、结束标签和CDATA内容。
3. 使用栈结构存储起始标签,结束时进行匹配。
4. CDATA部分不需要检查其内容的合法性。
*/
import java.util.Stack;
public class Solution {
public boolean isValid(String code) {
if (code == null || code.isEmpty()) return false;
Stack<String> stack = new Stack<>();
int i = 0;
while (i < code.length()) {
if (code.startsWith("<![CDATA[", i)) {
int j = i + 9;
i = code.indexOf("]]>", j);
if (i < 0) return false;
i += 3;
} else if (code.startsWith("</", i)) {
int j = i + 2;
i = code.indexOf('>', j);
if (i < 0 || i == j) return false;
String tagName = code.substring(j, i);
if (stack.isEmpty() || !stack.pop().equals(tagName)) return false;
i++;
} else if (code.startsWith("<", i)) {
int j = i + 1;
i = code.indexOf('>', j);
if (i < 0 || i == j || i - j > 9) return false;
String tagName = code.substring(j, i);
if (!tagName.matches("[A-Z]+")) return false;
stack.push(tagName);
i++;
} else {
i++;
}
}
return stack.isEmpty();
}
}
解释
方法:
这个题解使用栈来验证代码的合法性。遍历整个代码字符串,遇到开始标签时入栈,遇到结束标签时判断是否与栈顶标签匹配并出栈。同时需要处理 CDATA 标签和一些特殊情况。最后判断栈是否为空,为空则代码合法,否则不合法。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在处理CDATA部分时,如果CDATA标签内部包含了伪造的闭合标签如`]]>`,该如何确保算法不会错误地识别结束点?
▷🦆
函数`isValidTagName`中验证标签名称是否为大写的条件为何与长度检查分开,这是否有特殊的原因或优化?
▷🦆
在遇到非法标签时,算法是直接返回`False`,那么是否有可能存在某些情况下应该继续解析剩余字符串以检查其他可能的错误?
▷