题目大意:
HTML 实体解析器
「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。
HTML 里这些特殊字符和它们对应的字符实体包括:
- 双引号:字符实体为 quot; ,对应的字符是 ” 。
- 单引号:字符实体为 apos; ,对应的字符是 ‘ 。
- 与符号:字符实体为 amp; ,对应对的字符是 & 。
- 大于号:字符实体为 gt; ,对应的字符是 > 。
- 小于号:字符实体为 lt; ,对应的字符是 < 。
- 斜线号:字符实体为 frasl; ,对应的字符是 / 。
给你输入字符串 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 字符中的任意字符。
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1410
解题思路分析:
本题难度不大,实际上就是将题目中给出的几个特殊字符替换成相应的字符即可。解题时,我们从字符串的首位开始向后循环。当遇到字符”&”时我们需要注意,他可能是某个特殊字符的开头,因此我们需要从当前位启动第二层循环,循环起点为当前 “&” 所在位置,循环终点为当前位置后6位(如果不足6位循环到字符串末尾),向后循环6位的原因是,特殊字符中长度最长的为 frasl; ,抛去当前位”&”,剩下还有6位。在6位的循环中,我们查看是否存在 “&” 到当前位组成的特殊字符,如果存在,就将当前这部分替换为相应的字符,同时将外层循环的下标更改为当前下标,退出当前循环。如果内层循环结束后没有找到相应的特殊字符,我们保持外层循环的当前字符”&” 不变,继续循环。另外在外层循环中,如果当前字符不是 “&” ,保持不变即可。
实现代码:
public String entityParser(String text) {
// 为了提高效率,将字符串转为数组
char[] arr = text.toCharArray();
// 返回结果
StringBuilder sb = new StringBuilder();
// 循环每一个字符
for(int i=0;i<arr.length;i++){
// 如果当前字符是&
if(arr[i]=='&'){
// 查看当前字符后是否存在特殊字符
String temp = "&";
// 是否存在特殊字符
boolean isPaser=false;
// 从当前位置向后循环6位(不足6位时循环到字符串末尾)
for(int j=1;j<=6&&i+j<arr.length;j++){
// 将当前字符拼接至temp
temp+=arr[i+j];
// 如果temp等于某个特殊字符,将该特殊字符加入返回结果
// 同时将外层循环下标改为当前内层循环下标
if(temp.equals(""")){
sb.append("\"");
i+=j;
isPaser=true;
break;
}else if(temp.equals("'")){
sb.append("'");
i+=j;
isPaser=true;
break;
}else if(temp.equals("&")){
sb.append("&");
i+=j;
isPaser=true;
break;
}else if(temp.equals(">")){
sb.append(">");
i+=j;
isPaser=true;
break;
}else if(temp.equals("<")){
sb.append("<");
i+=j;
isPaser=true;
break;
}else if(temp.equals("⁄")){
sb.append("/");
i+=j;
isPaser=true;
break;
}
}
// 如果没匹配到任何特殊字符,将当前字符&添加至返回结果
if(!isPaser){
sb.append(arr[i]);
}
}else{
// 如果当前字符不是&,将当前字符添加至返回结果
sb.append(arr[i]);
}
}
return sb.toString();
}本题解法执行时间为53ms。
Runtime: 53 ms, faster than 52.24% of Java online submissions for HTML Entity Parser.
Memory Usage: 40.4 MB, less than 100.00% of Java online submissions for HTML Entity Parser.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1410-html-entity-parser-解题思路分析/