这是悦乐书的第303次更新,第322篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第171题(顺位题号是720)。给出表示英语词典的字符串单词数组,找到单词中长度最长的单词,此单词可以通过数组中的其他单词一次次构建一个字符而得来。如果有多个可能的答案,则返回字典顺序最小的最长单词。如果没有答案,则返回空字符串。例如:

输入:words = [“w”,“wo”,“wor”,“worl”,“world”]

输出:“world”

说明:“world”这个词可以通过“w”,“wo”,“wor”和“worl”一次构建一个字符。



输入:words = [“a”,“banana”,“app”,“appl”,“ap”,“apply”,“apple”]

输出:“apple”

说明:“apply”和“apple”都可以从字典中的其他单词构建。但是,“apple”在词典上比“apply”更小(靠前)。



注意

  • 输入中的所有字符串仅包含小写字母。

  • 单词的长度将在[1,1000]范围内。

  • 单词[i]的长度将在[1,30]的范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

在解题前,需要先注意题目中的几个信息,一是满足题目条件的结果字符串,是有一个个字符累加起来的,在我的一次提交中,有{"ew","ewq","ewqz"}这三个字符串,我的算法算出来是第三个"ewqz",但其实它还缺少一个"e",是不符合题目要求的。二是如果满足题目条件的字符串有两个或者多个,需要去比较谁更小,也就是按照字母顺序由小到大排列的,谁更靠前谁更小。

思路是先将字符串放进HashMap中,key为每一个单词,value为单词的长度。循环单词数组,比较谁的长度更小,此处分为两种情况处理:一是大于已有最大长度,二是等于已有最大长度,另外,无论遇到那种情况,都需要去判断当前字符是否是由单个单词一次次累加变成的,对此单独写了一个方法判断当前单词是否符合题目要求的方法isExists。针对第二种情况,需要去比较两个单词的大小,也写了一个额外的方法isMin来判断,如果满足,就将结果字符串更新,最长长度保持不变。

Map<String, Integer> map = new HashMap<String, Integer>();
public String longestWord(String[] words) {
for (String str : words) {
map.put(str, str.length());
}
int len = Integer.MIN_VALUE;
String result = "";
for (String str : words) {
if (isExists(str) && str.length() > len) {
result = str;
len = str.length();
} else if (isExists(str) && str.length() == len) {
if (result != "") {
if (isMin(str, result)) {
result = str;
}
}
}
}
return result;
} /**
* 判断str是否小于str2
* @param str 新遇到的等长字符串
* @param str2 上一次的最长字符串
* @return true:str中的字符小于str2
*/
public boolean isMin(String str, String str2){
for (int i=0; i<str.length(); i++) {
if (str.charAt(i) < str2.charAt(i)) {
return true;
} else if (str.charAt(i) == str2.charAt(i)) {
continue;
} else {
return false;
}
}
return false;
} /**
* 判断当前字符串在数组中是否是一个个字符慢慢累加起来的
* @param str
* @return
*/
public boolean isExists(String str) {
String ss = "";
for (char ch : str.toCharArray()) {
ss += ch;
if (!map.containsKey(ss)) {
return false;
}
}
return true;
}

03 第二种解法

在第一种解法中,并没有用到HashMap中的value值,因此可以使用HashSet来存储数组中的单词。其次,也可以通过数组排序的方式,省去后续循环中判断最长长度相等的情况,也省去了比较两个字符串谁更小的判断,更加的简洁。

Set<String> set = new HashSet<String>();
public String longestWord2(String[] words) {
Arrays.sort(words);
for (String word : words) {
set.add(word);
}
int len = Integer.MIN_VALUE;
String result = "";
for (String str : words) {
if (isExists2(str) && str.length() > len) {
result = str;
len = str.length();
}
}
return result;
} public boolean isExists2(String str) {
String ss = "";
for (char ch : str.toCharArray()) {
ss += ch;
if (!set.contains(ss)) {
return false;
}
}
return true;
}

04 第三种解法

也可以只使用一个循环来解决。依旧是数组排序,使用HashSet存储数组中的单词,但是存入HashSet的操作是在循环中进行的,如果当前单词的长度等于1或者其本身的子串也存在于HashSet中,才存入HashSet,此步骤就相当于第一种解法和第二种解法中判断当前单词是否符合题目要求,由一个字符一次次累加得来的。如果当前字符的长度大于结果单词的长度,就进行赋值更新操作。

public String longestWord3(String[] words) {
Set<String> set = new HashSet<String>();
Arrays.sort(words);
String result = "";
for (String word : words) {
if (word.length() == 1 || set.contains(word.substring(0, word.length()-1))) {
if (word.length() > result.length()) {
result = word;
}
set.add(word);
}
}
return result;
}

05 第四种解法

我们也可以不借助排序来实现,其实也是对第二种解法的优化。依旧是使用HashSet,也借助了一个辅助方法isExists2来判断当前单词是否符合题目要求,但不同的是,在循环中,此判断只在当前单词长度大于结果单词的长度,或者两者长度相等且新单词小于结果单词这两种情况下进行,而不像第二种解法那样,每次都去先判断当前单词是否符合题目要求,再去比较长度。其中,比较两个单词的大小借助了字符串自带的compareTo方法。

Set<String> set = new HashSet<String>();
public String longestWord4(String[] words) {
for (String word : words) {
set.add(word);
}
String result = "";
for (String word : words) {
if (word.length() > result.length() || (word.length() == result.length() && word.compareTo(result) < 0)) {
if (isExists2(word)) {
result = word;
}
}
}
return result;
} public boolean isExists2(String str) {
String ss = "";
for (char ch : str.toCharArray()) {
ss += ch;
if (!set.contains(ss)) {
return false;
}
}
return true;
}

06 小结

算法专题目前已日更超过五个月,算法题文章171+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Longest Word in Dictionary(Java实现)的更多相关文章

  1. LeetCode算法题-Longest Univalue Path(Java实现)

    这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...

  2. LeetCode算法题-Longest Harmonious Subsequence(Java实现)

    这是悦乐书的第270次更新,第284篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是594).我们定义一个和谐数组是一个数组,其最大值和最小值之间的差 ...

  3. LeetCode算法题-Longest Continuous Increasing Subsequence(Java实现)

    这是悦乐书的第286次更新,第303篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第154题(顺位题号是674).给定未排序的整数数组,找到最长连续增加子序列的长度.例如 ...

  4. LeetCode算法题-Longest Uncommon Subsequence I(Java实现)

    这是悦乐书的第252次更新,第265篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第119题(顺位题号是521).给定一组两个字符串,您需要找到这组两个字符串中最长的不同 ...

  5. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  6. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  7. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  8. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  9. LeetCode算法题-Self Dividing Numbers(Java实现)

    这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...

随机推荐

  1. js实现在当前页面搜索高亮显示字的方法

    在html页面上,有时候会遇到一些检索高亮显示的问题,具体用js是实现的方式,代码展示. Jsp页面设置方式 <li class="pull-left" id="s ...

  2. Hive的原理

    阅读目录 一.Hive内部表和外部表 1.Hive的create创建表的时候,选择的创建方式: - create table - create external table 2.特点: ● 在导入数据 ...

  3. shell 简单脚本编程

    shell脚本编程 编译器,解释器 编程语言: 机器语言,汇编语言,高级语言 静态语言:编译型语言 强类型(变量) 事先转换成可执行格式 C,C++,JAVA,C# 动态语言:解释型语言,on the ...

  4. SVN简介与安装

    SVN 简介: Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库(repository) 中. 这 ...

  5. PHP错误:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

    使用PHP连接MySQL 8的时候,可能会发生如标题所示的错误: SQLSTATE[HY000] [2054] The server requested authentication method u ...

  6. k8s实战之从私有仓库拉取镜像 - kubernetes

    1.实战目的 从私有docker仓库拉取镜像,部署pod.上一篇中,我们搭建了私有的镜像仓库,这一篇我们将与k8s结合实战使用私有仓库. 2.登录docker 为了完成本次实战,需要登录docker, ...

  7. brew 安装指定版本命令行工具 tmux 多版本实现

    Homebrew 是 macOS 命令安装工具,其核心库里的命令行在 github homebrew-core 仓库上维护. 核心库命令大概有 5000 条左右,大部分的命令行工具只保留了最新版本的 ...

  8. 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

    本文介绍如何保护API,无需看前边文章也能明白吧. 预备知识: http://www.cnblogs.com/cgzl/p/9010978.html http://www.cnblogs.com/cg ...

  9. Java读取Excel的另一种方法

    除了用poi读取Excel的表格外,还可用ExcelHelper读取Excel.代码一例 String[] fieldNames = new String[] { "studentId&qu ...

  10. The connection to the server localhost:8080 was refused - did you specify the right host or port?

    The connection to the server localhost:8080 was refused - did you specify the right host or port? 解决 ...