LeetCode5382. HTML 实体解析器

LeetCode5382. HTML 实体解析器

文章目录

  • LeetCode5382. HTML 实体解析器
    • 题目描述
    • 解题思路
    • AC代码

题目描述

「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。

HTML 里这些特殊字符和它们对应的字符实体包括:

  • 双引号:字符实体为 “& quot;” ,对应的字符是 " 。
  • 单引号:字符实体为 “& apos;” ,对应的字符是 ’ 。
  • 与符号:字符实体为 “& amp;” ,对应对的字符是 & 。
  • 大于号:字符实体为 “& gt;” ,对应的字符是 > 。
  • 小于号:字符实体为 “& lt;” ,对应的字符是 < 。
  • 斜线号:字符实体为 “& frasl;” ,对应的字符是 / 。

给你输入字符串 text ,请你实现一个 HTML 实体解析器,返回解析器解析后的结果。

示例 1:

输入:text = “& amp; is an HTML entity but &ambassador; is not.”
输出:"& is an HTML entity but &ambassador; is not."
解释:解析器把字符实体 & amp; 用 & 替换

示例 2:

输入:text = “and I quote: & quot;…& quot;”
输出:“and I quote: “…””

示例 3:

输入:text = “Stay home! Practice on Leetcode : )”
输出:“Stay home! Practice on Leetcode : )”

示例 4:

输入:text = “x & gt; y & amp;& amp; x & lt; y is always false”
输出:“x > y && x < y is always false”

示例 5:

输入:text = “leetcode.com & frasl;problemset & frasl;all”
输出:“leetcode.com/problemset/all”

提示:

  • 1 <= text.length <= 10^5字符串可能包含 256 个ASCII 字符中的任意字符。

解题思路

此题来源于 LeetCode第184场周赛,题目难度是 Medium,大约91%的参赛用户都成功通过了此题。
LeetCode5382. HTML 实体解析器_第1张图片
题意很好理解,就是说将字符串中的特殊符号替换为对应的实体符号。

我们的一个想法就是将特殊符号和实体符号的对应关系表示出来,然后查找字符串中是否出现特殊符号。如果是,则替换为对应的实体符号。

于是乎,我的实现方式是通过 Map的键值对形式存储符号的对应关系,然后对 Map的键进行遍历,同时搜索字符串中是否含有该键,有则替换为对应的键值。

因为考虑到对 String的替换会浪费大量的内存,所以我想的是用 StringBuilder进行替换,最后再转换为 String输出。

然而,很不幸,对于一个很长的测试用例,我超时了。这让我很苦恼,按道理来说我使用 StringBuilder已经很节省内存了,超时了还真是让我没了脾气。

我去看了一下通过人数,绝大部分用户都通过了这个题。我觉得这么多用户通过,这应该不是一个难题。

抱着试一试的心态,我直接用 String类型进行替换,然后就通过了,通过了,通过了。。。

真就不管内存开销,一通花里胡哨的操作,还不如简单粗暴的通过呢。[狗头][狗头][狗头]

AC代码

代码采用 Java语言进行书写。

这是原来的超时代码,因为 StringBuilder类中没有 replaceAll函数,我还特意写了一个 replaceAll进行对应字符串的全部替换。

class Solution {
    public String entityParser(String text) {
    	StringBuilder str = new StringBuilder(text);
    	String[] word = {""","\"","'","\'","&","&",">",">","<","<","⁄","/"};
    	HashMap map = new HashMap();
    	for(int i=0;i-1 && !oldS.equals(newS)){
    			while(flag>-1){
    				str.replace(flag, flag+oldS.length(), newS);
    				flag=str.indexOf(oldS);
    			}
    		}
    	}
    	return str;
    }
}

这是 AC代码

class Solution {
    public String entityParser(String text) {
    	String[] word = {""","\"","'","\'","&","&",">",">","<","<","⁄","/"};
    	for(int i=0;i

周赛结束后提交了测评查看了运行数据,可能是参赛用户用 Java的比较少吧,这数据还挺好看的哈哈哈。
LeetCode5382. HTML 实体解析器_第2张图片

你可能感兴趣的:(#,LeetCode题,字符串,java,leetcode)