力扣每日一题:HTML实体解析器
开篇
这是今天的每日一题,中等难度,只要有耐心,应该是能够写出来的。下面给大家分享我的思路与代码。
题目链接: 1410.HTML实体解析器
题目描述
代码思路
1.创建一个哈希表,把要替换的字符串和字符存进去。
2.由题目可知,每一个需要替换的字符实体都是由’&‘开头,’;'收尾。所以我们可以使用左右指针,来扫描寻找着两个字符。
3.每次找到这两个字符,就利用处理字符串的方法截取这段字符串,判断在哈希表中是否有这样的字符串,有则进行替换
代码纯享版
class Solution {public String entityParser(String text) {Map<String, Character> map = new HashMap<>();map.put(""", '\"');map.put("'", '\'');map.put("&", '&');map.put(">", '>');map.put("<", '<');map.put("⁄", '/');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();}
}
代码逐行解析版
class Solution {public String entityParser(String text) {Map<String, Character> map = new HashMap<>(); //创建哈希表map.put(""", '\"');map.put("'", '\'');map.put("&", '&'); //把字符实体和对应的字符放进去,注意单引号和双引号前面要加\map.put(">", '>');map.put("<", '<');map.put("⁄", '/');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替换,这个解法则是从第一个字符开始拼接出一个新的字符串
class Solution {static Map<String, String> map = new HashMap<>();static {map.put(""", "\"");map.put("'", "'");map.put("&", "&");map.put(">", ">");map.put("<", "<");map.put("⁄", "/");}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();}
}
结语
如果对这道题的分享对您有所帮助,点个赞或关注,我会每天更新力扣题的讲解,与大伙儿一起向前迈进!