【教3妹学编程-算法题】HTML 实体解析器
  96AOqGW9dKgh 2023年11月24日 22 0

【教3妹学编程-算法题】HTML 实体解析器_HTML

2哥 : 3妹,OpenAI的宫斗剧迎来了大结局!OpenAI宣布阿尔特曼复职CEO,董事会重组

3妹:啊?到底谁才是幕后操纵者啊,有咩有揪出来
2哥 : 也不是很清楚,据说在被开除的几周前,前CEO曾谴责一位董事会成员合著的一篇批评了OpenAI在AI安全的努力却称赞了OpenAI对家安全措施的研究论文,认为来自董事会成员的任何批评都会造成很大负面影响。
3妹:不过这个收场还是蛮好的
2哥 : 是的,董事会改组,Quora CEO留任独立董事,细节问题正在被合作解决。前总裁发文称OpenAI会比以前更强大、更团结。
3妹:2哥,你都可以当解说员了,对整个事件解析的很好。说到解析,我们来做一个“HTML 实体解析器”的题目吧~

【教3妹学编程-算法题】HTML 实体解析器_HTML_02

 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思路: 

【教3妹学编程-算法题】HTML 实体解析器_解析器_03

模拟,
「字符实体」都是由 & 开头的,所以我们只需要遍历一遍字符串,用一个变量 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();
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月24日 0

暂无评论

推荐阅读
  rvP2pqm8fEoB   2023年12月24日   31   0   0 ListJavaListJava
  8l4CZpTOKa7P   2023年12月26日   34   0   0 htmlhtml
  dwHry2iKGG0I   2023年12月26日   28   0   0 githubgithubhtmlhtml
96AOqGW9dKgh