news 2026/10/15 18:51:43

面试题 17.15. 最长单词

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试题 17.15. 最长单词

题目描述

给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。

示例:

输入:["cat","banana","dog","nana","walk","walker","dogwalker"]输出:"dogwalker"解释:"dogwalker"可由"dog"和"walker"组成。

代码实现

import java.util.*; class Solution { public String longestWord(String[] words) { // 按长度分组 Map<Integer, List<String>> map = new HashMap<>(); Set<String> set = new HashSet<>(); int maxL = 0; for (String s : words) { set.add(s); int k = s.length(); map.computeIfAbsent(k, key -> new ArrayList<>()).add(s); maxL = Math.max(maxL, k); } // 从最长到最短检查 while (maxL > 0) { if (map.containsKey(maxL)) { List<String> list = map.get(maxL); Collections.sort(list); // 字典序排序 for (String s : list) { set.remove(s); // 先移除当前单词 if (canBeFormed(s, set)) { return s; } set.add(s); // 恢复 } } maxL--; } return ""; } private boolean canBeFormed(String word, Set<String> dict) { if (word.isEmpty()) return false; boolean[] dp = new boolean[word.length() + 1]; dp[0] = true; for (int i = 1; i <= word.length(); i++) { for (int j = 0; j < i; j++) { if (dp[j] && dict.contains(word.substring(j, i))) { dp[i] = true; break; } } } return dp[word.length()]; } }

class Solution { public String longestWord(String[] words) { // 1. 对单词数组进行排序 // 规则:优先按长度降序排列(从长到短),长度相同时按字典序升序排列 Arrays.sort(words, (o1, o2) -> { if (o1.length() == o2.length()) // 长度相同时,按字典序升序排列(a在前,z在后) return o1.compareTo(o2); else { // 长度不同时,按长度降序排列(长在前,短在后) return Integer.compare(o2.length(), o1.length()); } }); // 2. 创建HashSet存储所有单词,便于快速查找 Set<String> set = new HashSet<>(Arrays.asList(words)); // 3. 遍历排序后的单词数组 // 由于已经按长度降序、字典序升序排序,找到的第一个符合条件的单词就是答案 for (String word : words) { // 3.1 先将当前单词从集合中移除,确保不会使用单词本身来构造自己 set.remove(word); // 3.2 检查当前单词是否能由集合中的其他单词组成 if (find(set, word)) return word; // 找到符合条件的单词,直接返回 // 3.3 恢复集合,准备检查下一个单词 set.add(word); } // 4. 没有找到符合条件的单词,返回空字符串 return ""; } // 递归方法:判断给定的单词是否能由字典(set)中的单词组成 public boolean find(Set<String> set, String word) { // 基线条件:如果单词长度为0,说明已经成功匹配完成 if (word.length() == 0) return true; // 尝试所有可能的分割点 for (int i = 0; i < word.length(); i++) { // 将单词分为两部分:word[0...i] 和 word[i+1...end] String prefix = word.substring(0, i + 1); // 如果前缀存在于字典中,并且剩余部分也能由字典中的单词组成 if (set.contains(prefix) && find(set, word.substring(i + 1))) return true; // 找到一种有效的分割方式 } // 所有分割方式都尝试过了,无法组成该单词 return false; } }

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

推行无纸化审图,国产CAD助力企业降本增效与绿色办公

在许多企业&#xff0c;项目评审会依然依赖打印A0甚至A1的大幅图纸。这不仅消耗大量的纸张和打印成本&#xff0c;会后图纸的存储、管理也极为不便&#xff0c;更与绿色办公的理念相悖。纸质流程本身也存在效率低下、批注易丢失、追溯困难等问题。CAXA CAD 为全面实现“无纸化审…

作者头像 李华
网站建设 2026/10/15 6:54:28

智能逗狗神器方案开发,狗狗跳跳球MCU方案设计

狗狗跳跳球是一款集自动运动、声光互动、智能启停于一体的宠物玩具&#xff0c;通过随机、不可预测的运动模式吸引狗狗追逐&#xff0c;同时具备防卡死、低功耗等功能&#xff0c;提升人宠互动体验。本文讨论狗狗跳跳球MCU方案开发设计思路。智能逗狗神器狗狗跳跳球MCU方案兼顾…

作者头像 李华
网站建设 2026/10/12 23:30:36

41、SharePoint开发准备与开发者仪表盘使用指南

SharePoint开发准备与开发者仪表盘使用指南 开发者仪表盘概述 开发者仪表盘是SharePoint中的一个诊断工具,能帮助诊断因自定义代码引入的一类错误。例如,一个Web部件在加载事件中检索大量数据,导致页面响应变慢,开发者仪表盘就能辅助诊断此类问题。它具备可扩展机制,能在…

作者头像 李华
网站建设 2026/10/15 0:01:37

毕业季必看!研究生必备的高效论文大纲模版指南

如果你是正在为论文焦头烂额的研究生&#xff0c;每天面对堆积如山的资料却不知如何下笔&#xff1b;或是担心论文进度缓慢&#xff0c;害怕无法按时毕业的科研人&#xff1b;又或是为了论文大纲反复修改&#xff0c;被导师多次打回的毕业生&#xff0c;那么这篇文章就是为你量…

作者头像 李华
网站建设 2026/10/13 21:46:24

答题流量主小程序源码+后台题库管理系统源码

效果演示源码下载&#xff1a;链接&#xff1a;https://pan.xunlei.com/s/VOh3tXuI4D8SqYtdNMfUUwv6A1?pwdkchg# 复制这段内容后打开「手机迅雷 App」即可获取。无需下载在线查看&#xff0c;视频原画享倍速播放功能演示效果&#xff1a;一、技术栈选型逻辑&#xff1a;轻量适…

作者头像 李华
网站建设 2026/10/10 22:57:01

PAT 1056 Mice and Rice

这一题的大意是说Np个老鼠参加比赛&#xff0c;相邻Ng个分成一组进行选拔&#xff0c;每组中选择最重的老鼠晋级&#xff0c;没有晋级的老鼠的排名一个样&#xff0c;按照这种思路给所有的老鼠进行排名&#xff0c;如果最后剩下不足Ng个仍可以分成一组&#xff0c;排名是跟分组…

作者头像 李华