Leetcode1410. HTML 实体解析器

Every day a Leetcode

题目来源:1410. HTML 实体解析器

解法1:模拟

遍历字符串 text,每次遇到 '&',就判断以下情况:

  • 双引号:字符实体为 " ,对应的字符是 " 。
  • 单引号:字符实体为 ' ,对应的字符是 ' 。
  • 与符号:字符实体为 & ,对应对的字符是 & 。
  • 大于号:字符实体为 > ,对应的字符是 > 。
  • 小于号:字符实体为 &lt; ,对应的字符是 < 。
  • 斜线号:字符实体为 &frasl; ,对应的字符是 / 。

如果是上述情况,将转换结果插入结果;如果都不是,则直接添加到结果里。

代码:

c 复制代码
/*
 * @lc app=leetcode.cn id=1410 lang=cpp
 *
 * [1410] HTML 实体解析器
 */

// @lc code=start
class Solution
{
public:
    string entityParser(string text)
    {
        string result;
        int i = 0;
        while (i < text.size())
        {
            if (text[i] == '&')
            {
                if (text.substr(i, 4) == "&gt;")
                {
                    result += '>';
                    i += 4;
                }
                else if (text.substr(i, 4) == "&lt;")
                {
                    result += '<';
                    i += 4;
                }
                else if (text.substr(i, 5) == "&amp;")
                {
                    result += '&';
                    i += 5;
                }
                else if (text.substr(i, 6) == "&quot;")
                {
                    result += '"';
                    i += 6;
                }
                else if (text.substr(i, 6) == "'")
                {
                    result += '\'';
                    i += 6;
                }
                else if (text.substr(i, 7) == "&frasl;")
                {
                    result += '/';
                    i += 7;
                }
                else
                    result += text[i++];
            }
            else
                result += text[i++];
        }
        return result;
    }
};
// @lc code=end

结果:

复杂度分析:

时间复杂度:O(n),其中 n 是字符串 text 的长度。

空间复杂度:O(1)。

解法2:模拟

本题要求把字符串中所有的「字符实体」替换成对应的字符。

「字符实体」都是由 & 开头的,所以我们只需要遍历一遍字符串,用一个变量 pos\textit{pos}pos 表示当前处理的位置,如果 text[pos]='&',就在这个位置进行探测。假设一个「字符实体」为 e,对应的字符为 c,那么可以通过判断 pos 位置开始,长度和 e 相同的子串是否和 e 相等,如果相等就可以替换。

代码:

c 复制代码
class Solution {
public:
    using EntityChar = pair <string, char>;

    vector <EntityChar> entityList;

    string entityParser(string text) {
        entityList = vector({
            (EntityChar){"&quot;", '"'},
            (EntityChar){"'", '\''},
            (EntityChar){"&amp;", '&'},
            (EntityChar){"&gt;", '>'},
            (EntityChar){"&lt;", '<'},
            (EntityChar){"&frasl;", '/'}
        });

        string r = "";
        for (int pos = 0; pos < text.size(); ) {
            bool isEntity = false;
            if (text[pos] == '&') {
                for (const auto &[e, c]: entityList) {
                    if (text.substr(pos, e.size()) == e) {
                        r.push_back(c);
                        pos += e.size();
                        isEntity = true;
                        break;
                    }
                }
            }
            if (!isEntity) {
                r.push_back(text[pos++]);
                continue;
            }
        }
        return r;
    }
};

结果:

复杂度分析:

时间复杂度:O(k×n),其中 n 是字符串 text 的长度。考虑最坏情况,每个位置都是 &,那么每个位置都要进行 6 次探测,探测的总时间代价和「实体字符」的总长度 k 相关,这里 k=6+6+5+4+4+7=32。

空间复杂度:O(k),这里用了 entityList 作为辅助变量,字符总数为 k+6,故渐进空间复杂度为 O(k+6)=O(k)。

相关推荐
丁劲犇1 分钟前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
牛客企业服务38 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
charlie1145141911 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
呜喵王阿尔萨斯1 小时前
编程中的英语
c语言·c++
糖葫芦君1 小时前
Policy Gradient【强化学习的数学原理】
算法
whoarethenext2 小时前
使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
开发语言·c++·faiss
zhanshuo3 小时前
不依赖框架,如何用 JS 实现一个完整的前端路由系统
前端·javascript·html
火柴盒zhang3 小时前
websheet在线电子表格(spreadsheet)在集团型企业财务报表中的应用
前端·html·报表·合并·spreadsheet·websheet·集团财务
向阳@向远方3 小时前
第二章 简单程序设计
开发语言·c++·算法
Mr_Xuhhh4 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构