1410 HTML 实体解析器 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。给你输入字符串 text ,请你实现一个 HTML 实体解析器,返回解析器解析后的字符串。
HTML 里这些特殊字符和它们对应的字符实体包括:
双引号:字符实体为 " ,对应的字符是 " 。
单引号:字符实体为 ' ,对应的字符是 ' 。
与符号:字符实体为 & ,对应对的字符是 & 。
大于号:字符实体为 > ,对应的字符是 > 。
小于号:字符实体为 < ,对应的字符是 < 。
斜线号:字符实体为 ⁄ ,对应的字符是 / 。
示例:
1 | 输入:text = "& is an HTML entity but &ambassador; is not." |
这个解法,是我今天刷题时写的,主要练习一下使用 uthash.h 构建 key 为字符串,value 为字符的哈希表。
解法描述:
text,当遍历到的字符是 & 时,我们就可以查表判断 & 字符之后的一段字符串,是否是这 6 个字符实体中的一个:
&,则不应替换,并及时停止、继续步骤 2。text 后,则字符实体替换结束。1 | // 构建 key 为字符串,value 为字符的哈希表 |
考虑最坏情况,如字符串 &&&&&&。在外循环中,遍历的每个位置都要进入内循环去查表,在内层循环中,每次都是探测到「一段字符串」的 最后位置,才发现不是字符实体。
O(kn),k 表示字符实体的最大长度,哈希表查表为 O(1)。O(s + 6),s 表示字符实体的长度和,为哈希表存储的 6 个字符实体的空间。1 | typedef struct _entityChar { |
考虑最坏情况,如字符串 &&&&&&。在外循环中,遍历的每个位置都要进入内循环去查表,在内层循环中,要比较 每一个长度不同 的字符实体。
O(sn),s 为字符实体的长度和。O(s + 6),变量 entityList 的空间。