【LeetCode:1410. HTML 实体解析器 | 模拟+哈希表+字符串+库函数】

|-----------|
| 🚀 算法题 🚀 |

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

|-----------|
| 🚀 算法题 🚀 |

🍔 目录

    • [🚩 题目链接](#🚩 题目链接)
    • [⛲ 题目描述](#⛲ 题目描述)
    • [🌟 求解思路&实现代码&运行结果](#🌟 求解思路&实现代码&运行结果)
      • [⚡ 字符串处理+库函数](#⚡ 字符串处理+库函数)
        • [🥦 求解思路](#🥦 求解思路)
        • [🥦 实现代码](#🥦 实现代码)
        • [🥦 运行结果](#🥦 运行结果)
      • [⚡ 模拟+哈希表+字符串](#⚡ 模拟+哈希表+字符串)
        • [🥦 求解思路](#🥦 求解思路)
        • [🥦 实现代码](#🥦 实现代码)
        • [🥦 运行结果](#🥦 运行结果)
    • [💬 共勉](#💬 共勉)

🚩 题目链接

⛲ 题目描述

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

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

双引号:字符实体为 " ,对应的字符是 " 。

单引号:字符实体为 ' ,对应的字符是 ' 。

与符号:字符实体为 & ,对应对的字符是 & 。

大于号:字符实体为 > ,对应的字符是 > 。

小于号:字符实体为 < ,对应的字符是 < 。

斜线号:字符实体为 ⁄ ,对应的字符是 / 。

给你输入字符串 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 字符中的任意字符。

🌟 求解思路&实现代码&运行结果


⚡ 字符串处理+库函数

🥦 求解思路
  1. 直接调用replaceAll的替换函数,但是需要注意一点的是,"&"替换"&"要放到最后进行,如果之前替换了,那么很有可能替换后的"&"与其它的单词组成要可以继续替换的单词,继续进行替换,从而最终的结果发生改变。
  2. 具体实现代码如下:
🥦 实现代码
java 复制代码
class Solution {
    public String entityParser(String text) {
        text=text.replaceAll("&quot;","\"");
        text=text.replaceAll("'","'");
        text=text.replaceAll("&gt;",">");
        text=text.replaceAll("&lt;","<");
        text=text.replaceAll("&frasl;","/");
        text=text.replaceAll("&amp;","&");
        return text;
    }
}
🥦 运行结果

⚡ 模拟+哈希表+字符串

🥦 求解思路
  1. 提前通过Hash表记录替换的映射,模拟遍历,从"&"开始,";'"结束,找到要被替换的单词,通过映射表返回替换的单词,最后通过StringBuilder进行快速拼接。
  2. 具体实现代码如下:
🥦 实现代码
java 复制代码
class Solution {
    public String entityParser(String text) {
        HashMap<String,String> map=new HashMap<>(){{
            put("&quot;", "\"");
            put("'", "'");
            put("&amp;", "&");
            put("&gt;", ">");
            put("&lt;", "<");
            put("&frasl;", "/");
        }};
        int n=text.length();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<n;i++){
            char c=text.charAt(i);
            if(c=='&'){
                int start=i;
                while(i<n&&text.charAt(i)!=';') i++;
                String str=text.substring(start,Math.min(i+1,n));
                if(map.containsKey(str)){
                    sb.append(map.get(str));
                }else{
                    i=start;
                    sb.append(c);
                }
            }else{
                sb.append(c);
            }
        }
        return sb.toString();
    }
}
🥦 运行结果

💬 共勉

|----------------------------------|
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |

相关推荐
白露与泡影22 分钟前
Spring Boot中的 6 种API请求参数读取方式
java·spring boot·后端
CodeClimb22 分钟前
【华为OD-E卷 - 服务失效判断 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
CodeClimb24 分钟前
【华为OD-E卷 - 九宫格按键输入 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
豪宇刘31 分钟前
MyBatis 与 MyBatis-Plus 的区别
java·tomcat
一个儒雅随和的男子39 分钟前
Spring为什么要用三级缓存解决循环依赖?
java·spring·缓存
梦想是成为Java高手39 分钟前
ThreadLocal的介绍与使用规范,初学者必看
java
StevenGerrad40 分钟前
【读书笔记/源码】How Tomcat Works 笔记 - c1~c10
java·笔记·tomcat
数据小小爬虫1 小时前
淘宝商品详情API返回值说明:Python爬虫代码示例
java·爬虫·python
起名方面没有灵感1 小时前
力扣23.合并K个升序链表
java·算法
m0_748233361 小时前
Spring中WebSocket的使用
java·websocket·spring