当前位置: 首页 > news >正文

赎金信(Hash的应用)

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ransom-note

思路:

        本题判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点。

  • 第一点“为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思”  这里说明杂志里面的字母不可重复使用。

  • 第二点 “你可以假设两个字符串均只含有小写字母。” 说明只有小写字母,这一点很重要

        因为题目所只有小写字母,那可以采用空间换取时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数。

        然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。

        依然是数组在哈希法中的应用。

        为什么不用map呢?,因为在本题中,使用map的空间消耗比数组要大一些,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。所以数组更加简单直接!

代码:

   

暴力解法:

// 时间复杂度: O(n^2)
// 空间复杂度:O(1)
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {for (int i = 0; i < magazine.length(); i++) {for (int j = 0; j < ransomNote.length(); j++) {// 在ransomNote中找到和magazine相同的字符if (magazine[i] == ransomNote[j]) {ransomNote.erase(ransomNote.begin() + j); // ransomNote删除这个字符break;}}}// 如果ransomNote为空,则说明magazine的字符可以组成ransomNoteif (ransomNote.length() == 0) {return true;}return false;}
};

哈希解法:

// 时间复杂度: O(n)
// 空间复杂度:O(1)
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int record[26] = {0};//addif (ransomNote.size() > magazine.size()) {return false;}for (int i = 0; i < magazine.length(); i++) {// 通过recode数据记录 magazine里各个字符出现次数record[magazine[i]-'a'] ++;}for (int j = 0; j < ransomNote.length(); j++) {// 遍历ransomNote,在record里对应的字符个数做--操作record[ransomNote[j]-'a']--;// 如果小于零说明ransomNote里出现的字符,magazine没有if(record[ransomNote[j]-'a'] < 0) {return false;}}return true;}
};
http://www.lryc.cn/news/62294.html

相关文章:

  • 4月更新!EasyOps®全平台27项新功能一口气来袭~
  • 程序计算任意连续的12个月公里数不超三万公里预警
  • 【IMU】IMU知多少之42866
  • 谁说不能用中文写代码?
  • Java阶段二Day07
  • React Native iOS打包详细步骤
  • I/O复用函数,poll和epoll的用法与select、poll、epoll的区别
  • 大数据周会-本周学习内容总结011
  • 常见的NoSQL数据库介绍
  • 记录安装Nodejs和HBuilderX搭建、部署微信小程序开发环境(一)
  • (一)pyahocorasick和marisa_trie,字符串快速查找的python包,自然语言处理,命名实体识别可用的高效包...
  • 基于Java+SpringBoot+vue+element驾校管理系统设计和实现
  • Unity中值类型和引用类型及使用时的注意事项
  • PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电
  • AI 这是要杀疯啦!
  • 【精品示例】超实用Python爬虫入门实例——做一个优质舔狗
  • TCP流量控制与拥塞控制
  • Java_异常
  • 自动化工具 接口自动化测试引擎
  • 十三、详解Kubernetes的存储管理器
  • java版 工程管理系统源码之提高工程项目管理软件的效率
  • VMware 安装 MS-DOS7.10 并配置网络
  • 嵌入式51单片机04-矩阵按键系列
  • 某安全对抗行走APP逆向分析
  • 数据库基础篇 《11.数据处理之增删改》
  • IDEA插件-MavenHapler
  • getaddrinfo调用crash 的debug过程
  • 【Sql】sql语句练习随记
  • IDEA社区版搭建Tomcat服务器并创建web项目
  • C++ [STL-简介]