「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。
HTML 里这些特殊字符和它们对应的字符实体包括:
给你输入字符串 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”
提示:
此题来源于 LeetCode第184场周赛,题目难度是 Medium,大约91%的参赛用户都成功通过了此题。
题意很好理解,就是说将字符串中的特殊符号替换为对应的实体符号。
我们的一个想法就是将特殊符号和实体符号的对应关系表示出来,然后查找字符串中是否出现特殊符号。如果是,则替换为对应的实体符号。
于是乎,我的实现方式是通过 Map的键值对形式存储符号的对应关系,然后对 Map的键进行遍历,同时搜索字符串中是否含有该键,有则替换为对应的键值。
因为考虑到对 String的替换会浪费大量的内存,所以我想的是用 StringBuilder进行替换,最后再转换为 String输出。
然而,很不幸,对于一个很长的测试用例,我超时了。这让我很苦恼,按道理来说我使用 StringBuilder已经很节省内存了,超时了还真是让我没了脾气。
我去看了一下通过人数,绝大部分用户都通过了这个题。我觉得这么多用户通过,这应该不是一个难题。
抱着试一试的心态,我直接用 String类型进行替换,然后就通过了,通过了,通过了。。。
真就不管内存开销,一通花里胡哨的操作,还不如简单粗暴的通过呢。[狗头][狗头][狗头]
代码采用 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