力扣每日一题-HTML实体解析器-2023.11.23

力扣每日一题:HTML实体解析器

开篇

这是今天的每日一题,中等难度,只要有耐心,应该是能够写出来的。下面给大家分享我的思路与代码。

题目链接: 1410.HTML实体解析器

题目描述

代码思路

1.创建一个哈希表,把要替换的字符串和字符存进去。

2.由题目可知,每一个需要替换的字符实体都是由'&'开头,';'收尾。所以我们可以使用左右指针,来扫描寻找着两个字符。

3.每次找到这两个字符,就利用处理字符串的方法截取这段字符串,判断在哈希表中是否有这样的字符串,有则进行替换

代码纯享版

java 复制代码
class Solution {
    public String entityParser(String text) {
        Map<String, Character> map = new HashMap<>();
        map.put("&quot;", '\"');map.put("'", '\'');map.put("&amp;", '&');
        map.put("&gt;", '>');map.put("&lt;", '<');map.put("&frasl;", '/');
        int left = 0, right = 0;
        StringBuffer str = new StringBuffer(text);
        while(true){
            while(left < str.length() && str.charAt(left) != '&') left++;
            right = left + 1;
            while(right < str.length() && str.charAt(right) != ';') right++;
            if(right >= str.length()) break;
            
            if(map.containsKey(str.substring(left, right + 1))) str.replace(left, right + 1, "" + map.get(str.substring(left, right + 1)));
            left++;
        }
        return str.toString();
    }
}

代码逐行解析版

java 复制代码
class Solution {
    public String entityParser(String text) {
        Map<String, Character> map = new HashMap<>(); //创建哈希表
        map.put("&quot;", '\"');map.put("'", '\'');map.put("&amp;", '&'); //把字符实体和对应的字符放进去,注意单引号和双引号前面要加\
        map.put("&gt;", '>');map.put("&lt;", '<');map.put("&frasl;", '/');
        int left = 0, right = 0; //双指针
        StringBuffer str = new StringBuffer(text); //将text转换成Stringbuffer类,方便操作
        while(true){
            while(left < str.length() && str.charAt(left) != '&') left++; //将left移到'&'的位置
            right = left + 1; //right至少在left后面
            while(right < str.length() && str.charAt(right) != ';') right++; //将right移到';'的位置
            if(right >= str.length()) break; //right没找到';',直接返回
            
            //利用substring截取left和right之间的字符串,如果在哈希表中存在,则替换
            if(map.containsKey(str.substring(left, right + 1))) str.replace(left, right + 1, "" + map.get(str.substring(left, right + 1))); 
            left++; //left指针右移1格
        }
        return str.toString();//返回字符串
    }
}

其它解法

利用滑动窗口的解法,我是对整个字符串进行1替换,这个解法则是从第一个字符开始拼接出一个新的字符串

java 复制代码
class Solution {
    static Map<String, String> map = new HashMap<>();
    static {
        map.put("&quot;", "\"");
        map.put("'", "'");
        map.put("&amp;", "&");
        map.put("&gt;", ">");
        map.put("&lt;", "<");
        map.put("&frasl;", "/");
    }
    public String entityParser(String text) {
        int l = 0, r = 0;
        StringBuilder sb = new StringBuilder();
        while (r < text.length()) {
            char ch = text.charAt(r++);
            if (ch != '&' && r - l == 1) {
                sb.append(ch);
                l = r;
            } else if (ch == ';' && r - l > 1) {
                String s = text.substring(l, r);
                sb.append(map.getOrDefault(s, s)); //牛逼
                l = r;
            } else if (ch == '&' && r - l > 1) {
                sb.append(text, l, r - 1);
                l = r - 1;
            }
        }
        if (r > l) sb.append(text, l, r);
        return sb.toString();
    }
}

结语

如果对这道题的分享对您有所帮助,点个赞或关注,我会每天更新力扣题的讲解,与大伙儿一起向前迈进!

相关推荐
lolo大魔王4 分钟前
Go语言的反射机制
开发语言·后端·算法·golang
白羊by16 分钟前
Softmax 激活函数详解:从数学原理到应用场景
网络·人工智能·深度学习·算法·损失函数
那个失眠的夜18 分钟前
AspectJ
java·开发语言·数据库·spring
杨凯凡24 分钟前
【014】基本类型与包装类:缓存、相等性、NPE
java·数据结构·缓存
故事和你9125 分钟前
洛谷-算法1-7-搜索3
数据结构·c++·算法·leetcode·动态规划
chipsense42 分钟前
霍尔电流传感器选型方法论再升级:从800V平台到TMR竞争的全场景决策树
算法·决策树·机器学习·闭环霍尔·tmr传感
emmjng3691 小时前
使用飞算JavaAI实现在线图书借阅平台
java
CoderYanger1 小时前
14届蓝桥杯省赛Java A 组Q1~Q3
java·开发语言·线性代数·算法·职场和发展·蓝桥杯
钮钴禄·爱因斯晨1 小时前
他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!
java·开发语言·前端·javascript·css·html
词元Max1 小时前
Java 转 AI Agent 开发学习路线(2026年3月最新版)
java·人工智能·学习