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

leetcode-383.赎金信

题源

383.赎金信

题目描述

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。示例 1:输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:输入:ransomNote = "aa", magazine = "aab"
输出:true
提示:1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小写英文字母组成

思考

思考一 – 哈希表 – 数组

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

那么magazine的长度必然>=ransomNote

开辟一个vector容器,先给magazine包含的字母计数+,再给ransomNote中的字母计数-,只要vector最

终没有负数元素,则返回true

剪枝

如果magazine的长度<ransomNote的长度,那么必然不能构成ransomNote,这就可以进行剪枝

实现思考一代码

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {//如果magazine 中的每个字符只能在 ransomNote 中使用一次,那么magazine的长度必然>=ransomNote//哈希表 -- 数组//开辟一个vector容器,先给magazine包含的字母计数+,再给ransomNote中的字母计数-,只要vector最终没有负数元素,则返回trueint mlength = magazine.length();int rlength = ransomNote.length();if(mlength < rlength)   return false;vector<int> count(26,0);//给magazine包含的字母计数+for (char c : magazine){count[c-'a']++;}//再给ransomNote中的字母计数-for (char c : ransomNote){count[c-'a']--;}//判断有没有负数元素for (int i : count){//有负数元素if(i < 0)   return false;}//没有负数元素return true;}
};

在这里插入图片描述
最后剪枝的用时和不剪的用时一样

说明在这个题的样例中这种magazine的长度<ransomNote的长度的情况很少。

时间复杂度分析

三个循环的时间复杂度都是O(n)
综合来看,该算法的时间复杂度仍然是O(n)

思考一代码二

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int recode[26] = {0};//这里可以不剪// if(ransomNote.size() > magazine.size()){//     return false;// }for(int i = 0; i < magazine.length(); i++){recode[magazine[i] - 'a']++;}for(int i = 0; i < ransomNote.length(); i++){recode[ransomNote[i] - 'a']--;if(recode[ransomNote[i] - 'a'] < 0){return false;}}return true;}
};

反而更快
在这里插入图片描述

时间复杂度分析

两个循环的时间复杂度都是O(n)

综合来看,该算法的时间复杂度仍然是O(n)

思考二 – 暴力

用两层循环,外层循环表示magazine,内层循环表示ransomNote

在ransomNote中找到与magazine相同的字母,如有相同,将该

ransomNote的元素删除,然后遍历下一个magazine

最后判断ransomNote是否为空

实现思考二代码

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {for (int i = 0; i < magazine.size();i++){for (int j = 0; j < ransomNote.size();j++){if (magazine[i] == ransomNote[j]){ransomNote.erase(ransomNote.begin()+j);//不能重复使用同一个magazine[i]break;}}}if (ransomNote.empty()) return true;return false;}
};

时间复杂度分析

两层for()循环的时间复杂度都是O(n^2)

erase 函数的时间复杂度通常是 O(n)

综合来看,该算法的时间复杂度仍然是O(n^3)
在这里插入图片描述

注:诸位站友如有所收获不如点个免费的赞,如有错误之处或有其它补充的点,请在评论区发表你的观点,看到必回。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 阿里ChatSDK使用,开箱即用聊天框
  • 前端面试题日常练-day92 【Less】
  • JVM OutOfMemoryError异常模拟
  • C语言经典程序100案例
  • 编程从零基础到进阶(更新中)
  • Redis 数据类型
  • 对服务器进行基本了解(二)
  • 如何制定高效的媒体公关解决方案
  • 网络抓包知识
  • MBR40150FCT-ASEMI无人机专用MBR40150FCT
  • SEO效果好的wordpress主题
  • 计算机视觉之SLAM与6Dof
  • 深度学习损失计算
  • SpringBoot使用开发环境的application.properties
  • go语言 fmt的几个打印区别以及打印格式
  • Android 架构优化~MVP 架构改造
  • CentOS从零开始部署Nodejs项目
  • CSS魔法堂:Absolute Positioning就这个样
  • flask接收请求并推入栈
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • java8-模拟hadoop
  • javascript从右向左截取指定位数字符的3种方法
  • node和express搭建代理服务器(源码)
  • PHP 小技巧
  • springboot_database项目介绍
  • Vue.js 移动端适配之 vw 解决方案
  • vue中实现单选
  • Zepto.js源码学习之二
  • 百度地图API标注+时间轴组件
  • 不上全站https的网站你们就等着被恶心死吧
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 今年的LC3大会没了?
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 如何优雅地使用 Sublime Text
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一个项目push到多个远程Git仓库
  • 最简单的无缝轮播
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #DBA杂记1
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)Java 简介
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (ZT)一个美国文科博士的YardLife
  • (附源码)ssm高校实验室 毕业设计 800008
  • (算法)求1到1亿间的质数或素数
  • (转)一些感悟
  • ***原理与防范
  • .gitignore
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net 应用中使用dot trace进行性能诊断
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法