news 2026/10/3 12:53:03

C++ 题解:统计字符串前缀数量(Trie 字典树)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 题解:统计字符串前缀数量(Trie 字典树)

1. 题目分析

本题要求统计在给定的 N 个字符串中,有多少个字符串是询问串 T 的前缀。输入字符串总长度不超过 106,仅包含小写字母,N 和 M 最大均为 105。

朴素做法是对于每个询问 T,遍历所有 Si 逐一判断是否为前缀,时间复杂度为 O(N × |T|),在数据规模较大时会超时。因此需要更高效的数据结构。

2. 解题思路:Trie 字典树

Trie(字典树)非常适合处理前缀匹配问题。我们将所有 Si 插入一棵 Trie 树,并在每个节点记录「经过该节点的字符串数量」。这样,对于询问 T,只需沿着 Trie 从根节点向下走,若能完整走完 T 的所有字符,则终点节点记录的计数就是答案;若中途某个字符不存在,则答案为 0。

具体步骤如下:

  • 建立 Trie 根节点,每个节点包含 26 个子节点指针(对应 26 个小写字母)和一个计数变量 cnt。
  • 插入每个 Si 时,沿途经过的每个节点 cnt 加 1,表示该节点作为前缀被多少个字符串经过。
  • 查询 T 时,从根节点出发,依次匹配 T 的每个字符。若某字符对应的子节点不存在,直接返回 0;否则继续向下,最终返回终点节点的 cnt。

3. C++ 代码实现

#include <bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 5; int trie[MAXN][26], cnt[MAXN], tot = 0; void insert(const string& s) { int u = 0; for (char c : s) { int v = c - 'a'; if (!trie[u][v]) trie[u][v] = ++tot; u = trie[u][v]; cnt[u]++; } } int query(const string& s) { int u = 0; for (char c : s) { int v = c - 'a'; if (!trie[u][v]) return 0; u = trie[u][v]; } return cnt[u]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; string s; for (int i = 0; i < n; i++) { cin >> s; insert(s); } for (int i = 0; i < m; i++) { cin >> s; cout << query(s) << '\n'; } return 0; }

4. 复杂度分析

操作时间复杂度空间复杂度
插入所有 SiO(总长度)O(总长度 × 26)
单次询问 TO(|T|)—
整体O(总长度 + Σ|T|)O(总长度 × 26)

由于输入字符串总长度不超过 106,Trie 节点数最多约为 106,空间可以接受。整体时间复杂度为线性级别,能够高效通过本题。

5. 样例验证

以样例输入为例:

3 2 ab bc abc abc efg

插入 ab、bc、abc 后,查询 abc:从根节点依次匹配 a、b、c,终点节点计数为 2(ab 和 abc 都经过该路径),输出 2。查询 efg:根节点下没有 e 子节点,输出 0。与样例输出一致。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 12:49:47

多台服务器日志分散难查?用Promtail+Loki+Grafana搭建集中检索平台

线上服务一旦拆到多台机器&#xff0c;日志查询就会变成一件很烦的事。我维护的几个后端服务分布在四台服务器上&#xff0c;平时排查问题基本靠 ssh 登上去&#xff0c;再 tail -f 或者 grep。单机还好&#xff0c;一旦某个请求跨了多个服务&#xff0c;或者要对比几台机器同一…

作者头像 李华
网站建设 2026/10/3 12:49:32

在1核2G的Linux服务器上部署MySQL 8需要优化哪些参数?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 12:49:28

AI写论文哪个软件最好?云智变AI毕业论文功能实测科普——云智变AI官网www.yunzhibian.cn,微信公众号搜一搜 云智变ai学术

先给一个可能让你意外的答案 打开搜索引擎搜“AI写论文哪个软件最好”&#xff0c;你会看到三种结果&#xff1a;一种把ChatGPT、Claude、DeepSeek挨个夸一遍&#xff0c;最后说“看个人需求”&#xff1b;一种直接甩出十几个工具清单&#xff0c;从图灵论文到笔灵AI一网打尽&…

作者头像 李华