2哥 : 3妹,OpenAI的宫斗剧迎来了大结局!OpenAI宣布阿尔特曼复职CEO,董事会重组
3妹:啊?到底谁才是幕后操纵者啊,有咩有揪出来
2哥 : 也不是很清楚,据说在被开除的几周前,前CEO曾谴责一位董事会成员合著的一篇批评了OpenAI在AI安全的努力却称赞了OpenAI对家安全措施的研究论文,认为来自董事会成员的任何批评都会造成很大负面影响。
3妹:不过这个收场还是蛮好的
2哥 : 是的,董事会改组,Quora CEO留任独立董事,细节问题正在被合作解决。前总裁发文称OpenAI会比以前更强大、更团结。
3妹:2哥,你都可以当解说员了,对整个事件解析的很好。说到解析,我们来做一个“HTML 实体解析器”的题目吧~
1题目:
「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。
HTML 里这些特殊字符和它们对应的字符实体包括:
双引号:字符实体为 " ,对应的字符是 " 。
单引号:字符实体为 ' ,对应的字符是 ' 。
与符号:字符实体为 & ,对应对的字符是 & 。
大于号:字符实体为 > ,对应的字符是 > 。
小于号:字符实体为 < ,对应的字符是 < 。
斜线号:字符实体为 ⁄ ,对应的字符是 / 。
给你输入字符串 text ,请你实现一个 HTML 实体解析器,返回解析器解析后的结果。
示例 1:
输入:text = "& is an HTML entity but &ambassador; is not."
输出:"& is an HTML entity but &ambassador; is not."
解释:解析器把字符实体 & 用 & 替换
示例 2:
输入:text = "and I quote: "...""
输出:"and I quote: "...""
示例 3:
输入:text = "Stay home! Practice on Leetcode :)"
输出:"Stay home! Practice on Leetcode :)"
示例 4:
输入:text = "x > y && x < y is always false"
输出:"x > y && x < y is always false"
示例 5:
输入:text = "leetcode.com⁄problemset⁄all"
输出:"leetcode.com/problemset/all"
提示:
1 <= text.length <= 10^5
字符串可能包含 256 个ASCII 字符中的任意字符。
2思路:
模拟,
「字符实体」都是由 & 开头的,所以我们只需要遍历一遍字符串,用一个变量 pos 表示当前处理的位置,如果 text[pos]=‘&’,就在这个位置进行探测。假设一个「字符实体」为 e,对应的字符为 c,那么可以通过判断 pos 位置开始,长度和 e 相同的子串是否和 e 相等,如果相等就可以替换。
3java代码:
class Solution {
class EntityChar {
String entity;
char character;
public EntityChar(String entity, char character) {
this.entity = entity;
this.character = character;
}
}
List<EntityChar> entityList = new ArrayList<EntityChar>();
public String entityParser(String text) {
entityList.add(new EntityChar(""", '"'));
entityList.add(new EntityChar("'", '\''));
entityList.add(new EntityChar("&", '&'));
entityList.add(new EntityChar(">", '>'));
entityList.add(new EntityChar("<", '<'));
entityList.add(new EntityChar("⁄", '/'));
StringBuffer res = new StringBuffer();
int length = text.length();
int pos = 0;
while (pos < length) {
boolean isEntity = false;
if (text.charAt(pos) == '&') {
for (EntityChar entityChar : entityList) {
String e = entityChar.entity;
char c = entityChar.character;
if (pos + e.length() <= text.length() && text.substring(pos, pos + e.length()).equals(e)) {
res.append(c);
pos += e.length();
isEntity = true;
break;
}
}
}
if (!isEntity) {
res.append(text.charAt(pos++));
continue;
}
}
return res.toString();
}
}