LeetCode算法题-Ransom Note(Java实现)
这是悦乐书的第212次更新,第225篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第80题(顺位题号是383)。给定一个任意赎金票据字符串和另一个包含所有杂志字母的字符串,如果赎金票据可以从杂志中构建,则写一个函数将返回true;否则,它将返回false。杂志字符串中的每个字母只能在赎金票据中使用一次。例如:
canConstruct(“a”,“b”) - > false
canConstruct(“aa”,“ab”) - > false
canConstruct(“aa”,“aab”) - > true
注意:您可以假设两个字符串仅包含小写字母。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
因为只有小写字母,可以将magazine所使用到的字符存入一个长度为26的数组,然后再去遍历ransomNote所使用到的字符,只要数组中某一位元素小于0,则返回false。
此解法的时间复杂度是O(n),空间复杂度是O(1)。
public boolean canConstruct(String ransomNote, String magazine) {
int[] arr = new int[26];
for (int i=0; i<magazine.length(); i++) {
arr[magazine.charAt(i)-'a']++;
}
for (int j=0; j<ransomNote.length(); j++) {
if (--arr[ransomNote.charAt(j)-'a'] < 0) {
return false;
}
}
return true;
}
03 第二种解法
思路和第一种解法一样,只不过是将传入的两个字符串先转换成字符数组而已。
此解法的时间复杂度是O(n),空间复杂度是O(n)。
public boolean canConstruct2(String ransomNote, String magazine) {
int[] arr = new int[26];
char[] note = ransomNote.toCharArray();
char[] maz = magazine.toCharArray();
for (int i=0; i<maz.length; i++) {
arr[maz[i]-'a']++;
}
for (int j=0; j<note.length; j++) {
if (arr[note[j]-'a']-- == 0) {
return false;
}
}
return true;
}
04 第三种解法
使用HashMap,先将magazine所使用的字符以及出现次数分别作为key和value存入其中,然后遍历ransomNote的字符,如果其当前字符在map中存在,并且其value值在减1后依然大于等于0,那么将此字符所对应的value值减1,反之直接返回false。
此解法因为用到了HashMap的contains方法,因此时间复杂度最好情况是O(n),最坏情况是O(n^2),空间复杂度是O(n)。
public boolean canConstruct3(String ransomNote, String magazine) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i=0; i<magazine.length(); i++) {
char c = magazine.charAt(i);
map.put(c, map.getOrDefault(c, 0)+1);
}
for (int j=0; j<ransomNote.length(); j++) {
char c = ransomNote.charAt(j);
if (map.containsKey(c) && map.get(c)-1 >= 0) {
map.put(c, map.get(c)-1);
} else {
return false;
}
}
return true;
}
05 第四种解法
依旧是使用HashMap,但是将第三种解法里面的两个循环压缩到一个循环里。循环遍历的对象依旧是ransomNote,获取当前字符c,同时定义一个变量pos,先判断c是否存在于map中,如果c存在于map中,则获取其对应的value并加1,再重新赋值给pos,如果pos大于magazine的长度,直接返回false。
接着重新获取pos的值,等于当前字符在magazine所在的索引(从pos位开始查找),如果pos等于-1,说明当前在ransomNote使用的字符不存在于magazine中,直接返回false,如果pos不等于-1,则将ransomNote的当前字符作为key,该字符在magazine中出现的pos为value存入map中。
此解法因为用到了HashMap的contains方法,因此时间复杂度最好情况是O(n),最坏情况是O(n^2),空间复杂度是O(1)。
public boolean canConstruct4(String ransomNote, String magazine) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (char c : ransomNote.toCharArray()) {
int pos = 0;
if (map.containsKey(c)) {
pos = map.get(c) + 1;
if (pos >= magazine.length()) {
return false;
}
}
pos = magazine.indexOf(c, pos);
if (pos == -1) {
return false;
}
map.put(c, pos);
}
return true;
}
06 小结
算法专题目前已连续日更超过两个月,算法题文章80+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Ransom Note(Java实现)的更多相关文章
- LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
- LeetCode算法题-Sqrt(Java实现)
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
随机推荐
- python字符串类型
python中的字符串 python中的字符串类型为str,也是平时操作的类型.但除了str类型,还有一个专门的名为"string"的模块(导入即可知),是很早以前没有str类型的 ...
- NTP时间服务器实战应用详解-技术流ken
简介 在搭建集群服务中,要保证各节点时间一致,NTP时间服务器就成为了一个好帮手了. 系统环境 系统版本:centos6.7 服务器IP:10.220..5.166/24 客户端IP:10.220.5 ...
- pxe+kickstart自动化批量安装系统详解-技术流ken
前言 pxe+kickstart是一款可以实现自动化批量安装系统的服务,比较经典,下面将详细介绍此服务的安装和使用. 系统环境准备 系统版本:CentOS release 6.7 (Final) 内网 ...
- RNN入门(一)识别MNIST数据集
RNN介绍 在读本文之前,读者应该对全连接神经网络(Fully Connected Neural Network, FCNN)和卷积神经网络( Convolutional Neural Netwo ...
- Java爬虫之下载全世界国家的国旗图片
介绍 本篇博客将继续上一篇博客:Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗 的内容,将用Java来实现这个爬虫,下载全世界国家的国旗图片. ...
- EF Codefirst 中间表(关系表)的增删改查(转)
EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD) 前言 此文章只是为了给新手程序员,和经验不多的程序员,在学习ef和lambada表达式的过程中可能遇到的问题. 本次使用订 ...
- MATLAB R2017a 进入主界面以后一直处于初始化状态的解决办法
自从前几天更新了win10系统,结果发现matlab不能用了,进入主界面一直初始化,没完没了. 网上说可能是许可证等问题,但经过尝试发现仍然无法解决问题. 仔细一想,发现win10系统的防火墙默默把它 ...
- JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- 教你分分钟搞定Docker私有仓库Registry
一.什么是Docker私有仓库Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候我们的服务器无法 ...
- iOS----------导航栏的正确隐藏方式
第一种做法 -注意这里一定要用动画的方式隐藏导航栏,这样在使用滑动返回手势的时候效果最好,和上面动图一致.这样做有一个缺点就是在切换tabBar的时候有一个导航栏向上消失的动画. - (void)vi ...