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

结语

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

相关推荐
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人1 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.2 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划
️南城丶北离2 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络
✿ ༺ ོIT技术༻2 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
tinker在coding4 小时前
Coding Caprice - Linked-List 1
算法·leetcode