力扣每日一题: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();
}
}
结语
如果对这道题的分享对您有所帮助,点个赞或关注,我会每天更新力扣题的讲解,与大伙儿一起向前迈进!