
本文介绍一种贪心算法,用于将多个带格式标记的文本片段智能合并为结构最优的html代码,在保证语义正确的同时最小化标签数量,并合理嵌套不同长度的格式链。
本文介绍一种贪心算法,用于将多个带格式标记的文本片段智能合并为结构最优的html代码,在保证语义正确的同时最小化标签数量,并合理嵌套不同长度的格式链。
要实现高效、语义清晰且标签精简的HTML格式合并(如 text1text2text3 → 优化为 text1text2text3),关键不在于逐段渲染,而在于全局感知格式跨度——即每个格式(如 bold、italic)实际覆盖哪些连续文本块。由此引出核心思想:按格式作用域长度降序排列,优先包裹更长的格式链;同时动态维护当前激活格式栈,仅在必要时开闭标签。
算法步骤(优化版贪心策略)
预处理:计算各格式的作用域
对每个格式f(如"bold"),扫描所有文本块,确定其首次开启位置start_f和最后一次关闭位置end_f(含end_f的前一块)。作用域长度len_f = end_f − start_f + 1。排序格式:按作用域长度降序
若len_italic > len_bold,则italic应处于外层;若相等,可依约定(如字典序或声明顺序)打破平局。-
构建格式事件流(关键)
为每块文本i(0-indexed),记录:-
starts[i]: 本块开始时需启用的格式集合(按作用域长度降序) -
ends[i]: 本块结束后需关闭的格式集合(即i+1块不再包含该格式)
-
-
单遍生成HTML(带栈管理)
维护当前已开启但未关闭的格式栈openStack(按嵌套深度从外到内),初始为空。遍历每块i:# 关闭不再需要的格式(从栈顶向下匹配) while openStack and openStack[-1] not in starts[i]: print(f"{openStack.pop()}>") # 开启新格式(按作用域长度降序,确保长格式在外) for f in sorted(starts[i], key=lambda x: -scope_len[x]): if f not in openStack: # 避免重复开启 print(f"") openStack.append(f) # 输出当前文本内容 print(texts[i])✅ 注意:
starts[i]是第i块起始时应激活的格式(即该块本身带此格式),而非“从此块开始生效”。因此关闭判断基于openStack[-1] not in starts[i]—— 若栈顶格式在下一块不出现,即需在此块后关闭。
示例验证
输入:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
text1[bold,italic] → starts[0] = {bold, italic}, scope: bold→[0,1], italic→[0,1]
text2[bold] → starts[1] = {bold}, scope: bold→[0,1], italic→[0,1]
text3[] → starts[2] = {}
-
scope_len:italic=2,bold=2→ 可按字母序排为[italic, bold] - i=0: 开
→ stack = ['i','b'] → 输出text1 - i=1:
starts[1]={bold}→ 'i' 不在其中 → 关;'b' 在 → 保留 → 输出text2 - i=2:
starts[2]={}→ 关→ 输出text3
最终:<i> <b>text1</b> text2 </i> text3
⚠️ 但注意:原需求中
text1[bold,italic]+text2[bold]+text3[]的期望输出是text1text2text3,说明bold 覆盖更长(0–1),italic 仅 0 → 此时scope_len[bold]=2,scope_len[italic]=1,bold 应在外层。算法自动适配:排序后starts[i]按[bold, italic]处理,i=0 开,i=1 仅需保留bold,故关,i=2 关,完美匹配。
实现提示与边界处理
-
空格式块:
starts[i] = set()表示无格式,触发全部关闭。 -
格式重叠不连续:如
text1[bold],text2[],text3[bold]→bold作用域为[0,0]和[2,2],非连续,scope_len[bold] = 1(取最大连续段),确保不错误跨段包裹。 - 性能:O(n·f + f log f),n 为文本块数,f 为格式种类数,适用于常规文档处理。
-
扩展性:支持任意嵌套格式(如
underline,code,color),只需统一纳入作用域分析与排序。
该算法以简洁的贪心逻辑,兼顾语义准确性与HTML结构优雅性,是富文本合并场景中标签优化的工业级实践方案。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










