这是悦乐书的第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实现)的更多相关文章

  1. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  2. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

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

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

  4. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  5. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

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

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

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

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

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

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

  9. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

随机推荐

  1. 网络扫描工具nmap

    nmap一般就用来扫描主机是否在线(特别是扫描局域网内存活的机器).开放了哪些端口.其他的功能用的比较少,做渗透的人可能要了解的多些. 1.1 选项说明 nmap需要自行安装. shell> y ...

  2. 关于VUE首屏加载过长的优化,VUE项目开发优化

    1. 按需引入UI组件 当下市面上流行的UI组件基本都支持按需加载,本文以Element UI为例: (1)     新建一个elementUI.js文件 (2)     访问地址找到按需引入方式的说 ...

  3. Python爬虫之多线程下载豆瓣Top250电影图片

    爬虫项目介绍   本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:   本次爬虫项目将分别不使用多线程和使 ...

  4. 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》

     SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...

  5. 关于Newtonsoft.Json,LINQ to JSON的一个小demo

    nuget获取Newtonsoft.Json github地址:Newtonsoft.Json public static void Test1() { /* 文本格式如下 代码实现目的: 1.VR ...

  6. 一个word文档中,多个表格的批量调整(根据窗口调整表格和添加表格水平线)

    Sub 自动调整所有表格() ' ' 自动调整所有表格 宏 ' 'Application.Browser.Target = wdBrowseTable For i = 1 To ActiveDocum ...

  7. [转]Docker版本变化和新版安装

    本文转自:http://www.cnblogs.com/Peter2014/p/7704306.html Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版 ...

  8. vb.net 使用NPO各種格式設定

    '導入命名空間Imports System.IO Imports NPOI.HSSF.UserModelImports NPOI.HPSFImports NPOI.POIFS.FileSystem P ...

  9. Spring 中事务控制的API介绍

    1.PlatformTransactionManager Spring所有事务代理类都是基于PlatformTransactionManager接口的实现. 此接口是spring的事务管理器,它里面提 ...

  10. Ubuntu 安装 chrome

    依次执行命令: sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ wget - ...