LeetCode 1410. HTML 实体解析器

题目描述

1410. HTML 实体解析器

思路分析

解法一:字符扫描(推荐)

核心思路

  • 维护实体映射表,逐字符扫描字符串。
  • 遇到 & 时尝试匹配合法实体,匹配成功则替换。
  • 否则按原字符输出。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示字符串长度。
  • 空间复杂度:O(1),映射表大小固定。
class Solution {
    public String entityParser(String text) {
        String[][] table = {
                {""", "\""},
                {"'", "'"},
                {"&", "&"},
                {">", ">"},
                {"&lt;", "<"},
                {"&frasl;", "/"}
        };

        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{
		{"&quot;", "\""},
		{"&apos;", "'"},
		{"&amp;", "&"},
		{"&gt;", ">"},
		{"&lt;", "<"},
		{"&frasl;", "/"},
	}

	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 中等
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/24641617
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!