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

结语

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

相关推荐
IT古董2 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼2 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
不爱编程的小九九2 小时前
小九源码-springboot082-java旅游攻略平台
java·开发语言·旅游
只是懒得想了2 小时前
用C++实现一个高效可扩展的行为树(Behavior Tree)框架
java·开发语言·c++·design-patterns
码农阿树2 小时前
Java 离线视频目标检测性能优化:从 Graphics2D 到 OpenCV 原生绘图的 20 倍性能提升实战
java·yolo·目标检测·音视频
夫唯不争,故无尤也2 小时前
Maven创建Java项目实战全流程
java·数据仓库·hive·hadoop·maven
weixin_404551242 小时前
openrewrite Maven plugin configuration
java·maven·configuration·openrewrite
我是华为OD~HR~栗栗呀2 小时前
华为OD-23届考研-Java面经
java·c++·后端·python·华为od·华为·面试
yan8626592462 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
Le1Yu2 小时前
服务注册、服务发现、OpenFeign及其OKHttp连接池实现
java·服务器