当前位置: 首页 > news >正文

算法双杀:Trie(前缀树)实现 + 全排列(回溯经典)| 面试必刷模板题

目录

一、Trie(前缀树):字符串查询的效率神器

什么是前缀树?

核心设计

完整实现代码

关键解析

二、全排列:回溯算法入门经典

题目描述

核心思路(回溯法)

完整实现代码

关键解析

三、两道题核心考点对比

总结


一、Trie(前缀树):字符串查询的效率神器

什么是前缀树?

Trie 是一种专门用于处理字符串前缀匹配的数据结构,核心优势是:

  • 插入、查询单词 / 前缀的时间复杂度均为 O (L)(L 为字符串长度),比哈希表更适合高频前缀查询场景
  • 常用于实现自动补全、拼写检查、敏感词过滤等功能

核心设计

每个 Trie 节点包含:

  1. children[26]:子节点数组(对应 26 个小写英文字母)
  2. isEnd:标记是否为单词的结束节点

完整实现代码

java

运行

class Trie { // Trie 节点定义 private static class TrieNode { TrieNode[] children; boolean isEnd; public TrieNode() { children = new TrieNode[26]; isEnd = false; } } private final TrieNode root; public Trie() { root = new TrieNode(); } // 插入单词 public void insert(String word) { TrieNode node = root; for (char c : word.toCharArray()) { int idx = c - 'a'; // 子节点不存在则创建 if (node.children[idx] == null) { node.children[idx] = new TrieNode(); } node = node.children[idx]; } // 标记单词结束 node.isEnd = true; } // 查询单词是否存在 public boolean search(String word) { TrieNode node = root; for (char c : word.toCharArray()) { int idx = c - 'a'; if (node.children[idx] == null) { return false; } node = node.children[idx]; } // 必须是结束节点才算完整单词 return node.isEnd; } // 查询是否存在以 prefix 为前缀的单词 public boolean startsWith(String prefix) { TrieNode node = root; for (char c : prefix.toCharArray()) { int idx = c - 'a'; if (node.children[idx] == null) { return false; } node = node.children[idx]; } // 只要前缀存在即可,无需判断 isEnd return true; } }

关键解析

  1. 插入流程:从根节点出发,逐个字符向下遍历,不存在的字符则创建新节点,最后标记结束节点
  2. 查询流程:与插入类似,逐个字符匹配,中途不存在则返回 false,查询单词需额外判断isEnd
  3. 前缀查询:与单词查询逻辑一致,无需判断isEnd,只要前缀路径存在即可

二、全排列:回溯算法入门经典

题目描述

给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。

核心思路(回溯法)

全排列的本质是枚举所有可能的排列组合,回溯法是解决这类问题的标准方法:

  1. 选择:每次选择一个未被使用的数字,加入当前排列
  2. 递归:继续选择下一个数字,直到排列长度等于数组长度
  3. 回溯:递归结束后,撤销上一步的选择,尝试其他可能

完整实现代码

java

运行

import java.util.ArrayList; import java.util.List; class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<>(); List<Integer> path = new ArrayList<>(); boolean[] used = new boolean[nums.length]; // 标记数字是否被使用 backtrack(nums, used, path, res); return res; } private void backtrack(int[] nums, boolean[] used, List<Integer> path, List<List<Integer>> res) { // 递归终止条件:排列长度等于数组长度 if (path.size() == nums.length) { res.add(new ArrayList<>(path)); // 拷贝当前路径,避免后续修改影响结果 return; } // 遍历所有数字,尝试选择未被使用的数字 for (int i = 0; i < nums.length; i++) { if (used[i]) continue; // 跳过已使用的数字 // 选择 used[i] = true; path.add(nums[i]); // 递归 backtrack(nums, used, path, res); // 回溯(撤销选择) path.remove(path.size() - 1); used[i] = false; } } }

关键解析

  1. used 数组:避免重复选择数字,确保每个数字在排列中只出现一次
  2. 路径拷贝:递归终止时,需要将当前路径的拷贝加入结果集,否则后续回溯会修改路径内容
  3. 回溯操作:递归返回后,撤销上一步的选择(移除路径末尾元素、标记数字为未使用),实现 “试错”

三、两道题核心考点对比

表格

题目核心算法关键技巧适用场景
Trie(前缀树)自定义数据结构 + 遍历节点设计、前缀匹配逻辑字符串高频查询、前缀匹配
全排列回溯算法选择 / 递归 / 回溯、状态标记枚举所有可能组合、排列组合问题

总结

这两道题分别代表了数据结构和算法的两个经典方向:

  • Trie 让你掌握字符串高效查询的实现思路,是处理字符串问题的利器
  • 全排列让你理解回溯算法的核心思想,是解决排列组合问题的通用模板
http://www.jsqmd.com/news/599275/

相关文章:

  • 避开时钟规划大坑:详解Vivado中BUFG、BUFH、BUFR的“高速公路”与“乡间小道”驱动规则
  • 工业视觉实战:如何用环形光+条形光组合搞定金属件表面缺陷检测?
  • C#海康视觉VM4.1二次开发框架源码:多流程、运动控制卡、服务框架详解
  • 提升网站开发效率:用快马AI一键生成企业站基础代码,专注业务逻辑开发
  • JavaScript 内存与引用:深究深浅拷贝、垃圾回收与 WeakMap/WeakSet
  • 电子顺磁共振(EPR)在材料科学中的前沿应用与挑战
  • 别再手动画模型了!手把手教你导入ADS厂商库(以RF_Passive_SMT为例)
  • 回溯算法双杀:子集 + 电话号码的字母组合 | 经典模板题解析
  • 安卓跑步打卡项目App源码分享:内含完整源码与简易开发文档
  • 激光技术在多物理场耦合应用中的案例分析:从增材制造到激光打孔与抛光的研究实例集萃
  • 用SolidWorks设计3D打印机:这些零件建模技巧能省你80%时间
  • 终极指南:解决Realtek 8922AE WiFi 7网卡驱动固件版本不匹配问题
  • 微信聊天记录持久化:基于本地解析技术的个人数据管理方案
  • 2026届必备的AI科研平台实际效果
  • 单机环境下的K8s快速部署与Kuboard实战:从零搭建Nginx服务
  • 20260406 之所思 - 人生如梦
  • 从零开始:手把手教你用Arduino和Grbl搭建自己的桌面CNC(附源码导读)
  • DevOps 实践与自动化:从开发到运维的无缝衔接
  • 低压无感BLDC方波控制,代码全部源码,方便调试移植,通用性极高,支持ADC方案,最高电转速1...
  • 如何永久保存微信聊天记录并挖掘数据价值?WeChatMsg全攻略
  • 两级光伏并网低电压穿越仿真研究
  • 自定义安卓图标样式:手把手教你用overlay修改framework-res,避开常见坑
  • 中国AI Agent发展现状与生态分析
  • 微秒制造背景下超快激光与物质作用机理研究:COMSOL仿真飞秒激光烧蚀石英玻璃的实践与展望
  • 2025届必备的十大AI辅助写作平台解析与推荐
  • 【OpenCode】npm命令安装opencode一直转圈圈【已解决】
  • 磁链观测器在vesc中的移植实践:实现零速闭环启动,全方位学习资源呈现
  • LangGraph Node底层逻辑教程(非常详细),从入门到精通,看这篇就够了!
  • 手把手教你用Vivado IBERT给光模块‘体检’:从SFP连接器到误码率报告的完整实战
  • RetDec反编译神器:从零开始掌握二进制代码逆向分析