LeetCode 1410. HTML 实体解析器
题目描述
思路分析
解法一:字符扫描(推荐)
核心思路:
- 维护实体映射表,逐字符扫描字符串。
- 遇到
&时尝试匹配合法实体,匹配成功则替换。- 否则按原字符输出。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(1),映射表大小固定。
class Solution {
public String entityParser(String text) {
String[][] table = {
{""", "\""},
{"'", "'"},
{"&", "&"},
{">", ">"},
{"<", "<"},
{"⁄", "/"}
};
StringBuilder res = new StringBuilder();
int i = 0;
while (i < text.length()) {
if (text.charAt(i) != '&') {
res.append(text.charAt(i));
i++;
continue;
}
boolean matched = false;
for (String[] pair : table) {
String key = pair[0];
if (text.startsWith(key, i)) {
res.append(pair[1]);
i += key.length();
matched = true;
break;
}
}
if (!matched) {
res.append(text.charAt(i));
i++;
}
}
return res.toString();
}
}
func entityParser(text string) string {
table := [][2]string{
{""", "\""},
{"'", "'"},
{"&", "&"},
{">", ">"},
{"<", "<"},
{"⁄", "/"},
}
res := make([]byte, 0, len(text))
for i := 0; i < len(text); {
if text[i] != '&' {
res = append(res, text[i])
i++
continue
}
matched := false
for _, pair := range table {
key := pair[0]
if i+len(key) <= len(text) && text[i:i+len(key)] == key {
res = append(res, pair[1]...)
i += len(key)
matched = true
break
}
}
if !matched {
res = append(res, text[i])
i++
}
}
return string(res)
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 394. 字符串解码 | 中等 | 栈 |
| 1106. 解析布尔表达式 | 困难 | 栈 |
| 150. 逆波兰表达式求值 | 中等 | 栈 |
| 224. 基本计算器 | 困难 | 栈 |
| 227. 基本计算器 II | 中等 | 栈 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!