力扣每日一题-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();
    }
}

结语

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

相关推荐
福大大架构师每日一题7 分钟前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言
EterNity_TiMe_21 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
机器学习之心32 分钟前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
儿时可乖了35 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol37 分钟前
java基础概念37:正则表达式2-爬虫
java
yyt_cdeyyds43 分钟前
FIFO和LRU算法实现操作系统中主存管理
算法
xmh-sxh-13141 小时前
jdk各个版本介绍
java
daiyang123...1 小时前
测试岗位应该学什么
数据结构