题目大意:
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.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1410-html-entity-parser-解题思路分析/