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
的空间。