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

结语

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

相关推荐
码语智行5 分钟前
首页地图功能分析
java
段ヤシ.9 分钟前
回顾Java知识点,面试题汇总Day10:日期类、IO流(持续更新)
java·序列化·反序列化·日期类·i/o流
luck_bor38 分钟前
IO流知识点笔记
java·开发语言·笔记
妄想出头的工业炼药师1 小时前
LVIO鲁棒
算法·开源
aini_lovee1 小时前
MATLAB 图像修复 — 偏微分方程方法
算法
Cthy_hy1 小时前
Python算法竞赛:排列组合核心用法
开发语言·python·算法
大圣编程1 小时前
面向对象深度理解
java·开发语言·算法
爱喝水的鱼丶1 小时前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇) 第四篇:SAP 报表异常处理机制:数据校验与消息提示规范落地
开发语言·数据库·学习·算法·sap·abap
影寂ldy1 小时前
C# const 常量 / readonly 只读 / static readonly
java·开发语言·c#
摇滚侠2 小时前
Maven 入门+高深 体系外 jar 包导入 172
java·maven·jar