LEETCODE 1410. HTML Entity Parser 解题思路分析

题目大意:

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: &quot;...&quot;"
输出:"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-解题思路分析/
此条目发表在leetcode分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。