这是悦乐书的第309次更新,第330篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748)。从给定的字典单词中查找最小长度单词,其中包含字符串licensePlate中的所有字母。据说这样的单词可以完成给定的字符串licensePlate。在这里,对于字母我们忽略大小写。例如,licensePlate上的“P”仍与单词上的“p”匹配。答案肯定存在。如果有多个答案,则返回数组中首先出现的答案。licensePlate可能会多次出现相同的字母。例如,给定licensePlate为“PP”,单词“pair”不会完成licensePlate,但单词“supper”会完成。例如:

输入:licensePlate =“1s3 PSt”,words = [“step”,“steps”,“stripe”,“stepple”]

输出:“steps”

说明:包含字母“S”,“P”,“S”和“T”的最小长度字。请注意,答案不是“step”,因为字母“s”必须出现在单词中两次。另请注意,为了比较单词中是否存在字母,我们忽略了大小写。



输入:licensePlate =“1s3 456”,words = [“look”,“pest”,“stew”,“show”]

输出:“pest”

说明:有3个最小长度的单词,包含字母“s”。我们返回先出现的那个。



注意:

  • licensePlate将是一个长度在[1,7]范围内的字符串。

  • licensePlate将包含数字,空格或字母(大写或小写)。

  • 数组的长度范围为[10,1000]。

  • 每个words[i]将由小写字母组成,并且长度在[1,15]范围内。

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

02 第一种解法

给定的licensePlate中包含数字、空格或大写字母,而比较时是忽略大小写的,所以我们先将licensePlate中的字母抽出来,并且将里面的大写字母转为小写,变成一个新的字符串。然后开始遍历words数组,比较数组的当前元素和前面得到的新字符串的关系,判断此单词是否能够由新字符串组成,在此将判断的方法独立处理,判断的方法是借助容量为26的整数数组,新字符串中有的字母,此单词中必须要有,否则就返回false。

public String shortestCompletingWord(String licensePlate, String[] words) {
String s = "";
for (char ch : licensePlate.toCharArray()) {
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
s += ch;
}
}
s = s.toLowerCase();
String res = "";
for (String str : words) {
if ((res.isEmpty() || res.length() > str.length()) && isContains(s, str)) {
res = str;
}
}
return res;
} /**
* 判断此单词是否全部包含新字符串中的字母
* @param s licensePlate中英文字母组成的字符串
* @param s2 words中的每个单词
* @return
*/
public boolean isContains(String s, String s2) {
int[] arr = new int[26];
// 将单词中的字母出现次数记数
for (char ch : s2.toCharArray()) {
arr[ch-'a']++;
}
for (char ch : s.toCharArray()) {
// 新字符串中的当前字母在单词中不存在
if (arr[ch-'a'] == 0) {
return false;
}
arr[ch-'a']--;
}
return true;
}

03 第二种解法

我们也可以将辅助方法融合到主方法中去。依旧是先将licensePlate里的字母抽出来,存入一个容量26的数组中,此处多使用了一个变量来记录新字符串中字母的总数量。然后开始循环处理words中的元素,每次循环都需要将数组和总数量复制一份,然后去做判断,判断的逻辑和上面第一种解法的思路类似。

public String shortestCompletingWord2(String licensePlate, String[] words) {
int[] arr = new int[26];
int count = 0;
for (char ch : licensePlate.toCharArray()) {
if (ch >= 'a' && ch <= 'z') {
arr[ch-'a']++;
count++;
} else if(ch >= 'A' && ch <= 'Z') {
arr[ch-'A']++;
count++;
}
}
String result = "";
for (String str : words) {
int temp = count;
int[] copy = arr.clone();
for (char ch : str.toCharArray()) {
if (--copy[ch-'a'] >= 0) {
temp--;
}
}
if (temp == 0 && (result.isEmpty() || result.length() > str.length())) {
result = str;
}
}
return result;
}

04 小结

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

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

LeetCode算法题-Shortest Completing Word(Java实现)的更多相关文章

  1. LeetCode算法题-Shortest Unsorted Continuous Subarray(Java实现)

    这是悦乐书的第267次更新,第281篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第134题(顺位题号是581).给定一个整数数组,找到一个连续的子数组,按升序对该子数组 ...

  2. LeetCode算法题-Shortest Distance to a Character(Java实现)

    这是悦乐书的第321次更新,第343篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第191题(顺位题号是821).给定字符串S和字符C,返回一个整数数组,表示字符串中所有 ...

  3. LeetCode算法题-Most Common Word(Java实现)

    这是悦乐书的第321次更新,第342篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第190题(顺位题号是819).给定一个段落和一组禁止词,返回不在禁止词列表中的最常用词 ...

  4. LeetCode算法题-Detect Capital(Java实现)

    这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...

  5. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  6. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  7. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  8. LeetCode算法题-Flood Fill(Java实现)

    这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...

  9. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

随机推荐

  1. SQL Server排名或排序的函数

    SQL Server获得排名或排序的函数有如下几种: 1.Rank():在结果集中每一条记录所在的排名位置,但排名可能不连续,例如:若同一组内有两个第一名,则该组内下一个名次直接跳至第三名   sel ...

  2. 【死磕Java并发】-----Java内存模型之happens-before

    在上篇博客([死磕Java并发]-–深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题.那么我们正确使用同步.锁的情况下 ...

  3. Java注解(Annotation):请不要小看我!

    Java注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分.注解对于代码的运行效果没有直接影响. 网络上对注解的解释过于严肃.刻板,这并不是我喜欢的风格.尽管这样的 ...

  4. Flink从入门到放弃(入门篇4) DataStreamAPI

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  5. .NET西安社区 [拥抱开源,又见 .NET] 第二次活动简报

    「拥抱开源, 又见 .NET」 随着 .NET Core的发布和开源,.NET又重新回到人们的视野. .NET Core的下个3.0即将release,加入非常多的新功能,越来越拥抱变化,DevOps ...

  6. 旅游公司租车问题 —— 动态规划 v.s. + Leapms线性规划

    有一个旅游公司承包一条旅游线路,未来四周内的大巴车需求分别是:4辆.1辆.4辆和5辆.该公司向租车公司租赁服务,租车公司的计价方案是:租车收取一次性手续费3000,每车每周费用2000.求最节省租车方 ...

  7. 使用cookie来做身份认证

    文章是msdn的官方文档,链接在这里.其实也有中文的文档,这里还是想做一个记录. 文章有asp.net core 2.x 和1.x 版本,我这里就忽略1.x了. 下面先说几点额外的东西有助于理解. A ...

  8. 用bat批处理程序通过DOS命令行删除所有的空文件夹

    用过gothub或者码云的同学都知道,不包含任何文件的空文件夹上传提交时不被允许的.当然你可以在空文件下创建.keep文件(或.gitkeep文件),然后就可以上传了. 但是如果空文件夹比较多,并且我 ...

  9. PHP遍历文件夹下所有文件

    不论是面试还是正常工作需要都会用到遍历文件夹下的所有文件,今天就记录一下笔记.废话不多说直接上代码: <?php /** * 遍历当前文件夹展示所有的文件和目录 */ function dirL ...

  10. JavaScript 是如何工作的:JavaScript 的内存模型

    摘要: 从内存角度理解 let 和 const 的意义. 原文:JavaScript 是如何工作的:JavaScript 的内存模型 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这 ...