基于Trie树的多字符抽取式英文缩写生成器开发求助
问题分析与解决方案:非连续字符抽取的英文缩写生成器
问题核心
你的现有实现只能匹配输入文本中的连续子串作为缩写,无法抽取非连续的字符组合(比如示例中的cheer)。根本原因在于:
multisearch仅遍历输入的每个起始位置,检查从该位置开始的连续后缀search函数按顺序连续匹配Trie节点,不允许跳过字符,完全未处理非连续匹配的场景
解决方案:DFS+Trie实现非连续字符匹配
要实现从输入文本中抽取非连续字符组成有效单词,需要用**深度优先搜索(DFS)**遍历输入文本的每个字符,同时在Trie中回溯匹配,允许跳过字符,记录所有可能的有效单词。
修改后的核心代码
替换原有的search和multisearch函数,新增DFS递归逻辑:
// 用Set存储结果自动去重 public static Set<String> validAcronyms = new HashSet<>(); // DFS递归搜索非连续字符匹配 static void dfs(TrieNode currentNode, String input, int pos, StringBuilder currentAcronym) { // 到达单词节点时记录当前缩写 if (currentNode.isEndOfWord) { validAcronyms.add(currentAcronym.toString()); } // 遍历到输入末尾则终止递归 if (pos >= input.length()) { return; } // 选项1:跳过当前字符,继续处理下一个位置 dfs(currentNode, input, pos + 1, currentAcronym); // 选项2:尝试匹配当前字符 char c = input.charAt(pos); int index = c - 'a'; if (index >= 0 && index < ALPHABET_SIZE && currentNode.children[index] != null) { currentAcronym.append(c); dfs(currentNode.children[index], input, pos + 1, currentAcronym); currentAcronym.deleteCharAt(currentAcronym.length() - 1); // 回溯,移除当前字符 } } // 替换原multisearch的入口函数 static void findAllAcronyms(String input) { validAcronyms.clear(); dfs(root, input, 0, new StringBuilder()); }
修改run函数中的调用逻辑
把原来的multisearch(input);替换为:
findAllAcronyms(input); // 整理结果输出 TempA = String.join("\n", validAcronyms);
代码逻辑说明
- 递归分支选择:每个递归步骤有两种处理方式——跳过当前字符继续遍历,或匹配当前字符并进入Trie子节点
- 回溯机制:匹配字符后,完成递归需要删除最后添加的字符,保证后续分支的独立性
- 去重处理:用
HashSet存储结果,避免同一个单词被不同路径重复匹配 - 可扩展性:可以添加长度过滤逻辑,比如在记录结果时判断
currentAcronym.length()是否在2-8之间,过滤无意义的过短/过长缩写
额外优化建议
- 字典预处理:插入Trie前过滤掉长度不符合要求的单词(比如只保留2-8个字符的单词),减小Trie体积,提升搜索效率
- 优先级排序:给结果按单词使用频率、长度排序,优先展示更常用的缩写
- 大写字符优先:针对原输入中的大写字符,可在DFS中优先匹配这类字符,贴合用户输入的重点标记
内容的提问来源于stack exchange,提问作者HK Kongou
相关产品推荐
相关产品推荐

