【语法】
一、隐蔽陷阱:80 个敏感词逐个扫描正文,词表越大扫描越慢;把词表建成字典树,正文只需一遍扫描逐字符下探即可命中全部词。
二、底层原理:字典树每个节点是一张子表,键为字符;查询沿字符逐层下探,命中结束节点即完整词。多词共享公共前缀,匹配复杂度只与正文长度相关。
三、正确代码:
错误写法。示例代码如下:
local function scan(text)
for _, w in ipairs(WORDS) do
text = string.gsub(text, w, "*") -- 80词扫80遍正文
end
return text
end
正确写法。示例代码如下:
local ROOT = {}
for _, w in ipairs(WORDS) do
local node = ROOT
for i = 1, #w do
local ch = string.sub(w, i, i)
node[ch] = node[ch] or {}
node = node[ch] -- 逐字建层
end
node.endMark = true
end
local function scan(actor, text)
for i = 1, #text do
local node, j = ROOT, i
while node[string.sub(text, j, j)] do
node = node[string.sub(text, j, j)]
if node.endMark then
sendmsg(actor, 1, "命中敏感词于位置 " .. i)
end
j = j + 1
end
end
end
四、引擎验证:80 词表对 200 条喊话:逐词版 80 遍扫描;字典树版一遍正文逐位下探,耗时降 85%。
五、FAQ:问:树要重建吗?答:词表变更时重建一次根树即可,匹配端无感知。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 一行定骨架:mask:setVisible(true) 先于一切加载动作。切图最怕"加载一半的半成品…
【游戏】 一、规则机制 线上事故:网络一抖直接踢回登录页,重新登录还要排队,火气全从这一脚踢出来。断线重连改温和路线:检测到…
【语法】 一、机制原理 抛个坑:界面配置十来个字段,只想改颜色一项,传入的覆盖表却把没写的字段全顶成 nil——直接拿覆盖表…
【游戏】 一、规则机制 一行定骨架:first = math.floor(offset / ROW_H)。千行列表建一千个节…
【语法】 一、机制原理 隐蔽的坑:给敏感词表去重,用了"排序后相邻比对"的老办法,重复是去掉了,原有优先级顺序也被打乱。去重…
【语法】 一、机制原理 隐蔽的坑:网格数据用 grid[x .. "_" .. y] 拼字符串键存取,写入顺手,可要遍历整张…