LeeCode 30

2024-09-04 23:12
文章标签 30 leecode

本文主要是介绍LeeCode 30,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeeCode 30

题目:

image.png

思路:

朴素的想法,是创建一个 m p mp mp哈希表记录 w o r d s words words中所有字符出现的次数,令 n n n s . s i z e ( ) s.size() s.size(), m m m w o r d s . s i z e ( ) words.size() words.size() l e n len len w o r d s [ 0 ] . s i z e ( ) words[0].size() words[0].size()。然后枚举 s s s中的每一个字符为一个子串的起点,创建第二个 c n t H A S H cntHASH cntHASH,再遍历子串中的单词,最后检查 c n t cnt cnt是否等于 m p mp mp,显然该算法的时间复杂度为 O ( n × m × l e n ) O(n\times m\times len) O(n×m×len)

image.png

根据题目给的数据范围,最坏约为 1 0 9 10^{9} 109,而LeetCode时间限制一秒,一般一秒处理 1 0 7 10^{7} 107左右,所以超时了

Code

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {int n = s.length(), m = words.size(), w = words[0].length();unordered_map<string, int> map;for (const string& word : words) {map[word]++;}vector<int> ans;for (int i = 0; i + m * w <= n; i++) {unordered_map<string, int> cur;string sub = s.substr(i, m * w);bool valid = true;for (int j = 0; j < sub.length(); j += w) {string item = sub.substr(j, w);if (map.find(item) == map.end()) {valid = false;break;}cur[item]++;}if (valid && cur == map) {ans.push_back(i);}}return ans;}
};

优化:

每个子串的起点是不可避免的需要枚举的,但是我们检查子串是否合法的的过程中,窗口每向前移动一次,我们就要遍历一次子串,与此同时我们发现,当前检查完的 c n t cnt cnt哈希表可以通过删除左侧的单词,添加右侧的的单词,得到窗口向前直接滑一个单词的长度后的 c n t cnt cnt的状态,所以我们把 n m o d l e n n\bmod len nmodlen将起点分为len类(只有 m o d l e n \bmod len modlen才能遍历所有的合法的起点,因为每次要向前滑 l e n len len i + k × l e n ( 0 ≤ i ≤ l e n − 1 ) i+k\times len (0\leq i\leq len-1) i+k×len(0ilen1)遍历每个与它相同余数的起点。

AcCode

class Solution
{
public:vector<int> findSubstring(string s, vector<string> &words){unordered_map<string, int> mp;for (auto x : words){mp[x]++;}vector<int> ans;int n = s.size();int m = words.size();int len = words[0].size();for (int i = 0; i < len; i++){unordered_map<string, int> cnt;for (int j = i; j + len <= n; j += len){// j,i为起始位置,len为单词长度string tmp = s.substr(j, len);cnt[tmp]++;// 当有一个完整的窗口时,滑动窗口,每次移动一个单词的长度if (j >= i + m * len){string tmp = s.substr(j - m * len, len);// 删除最左边的单词,cnt[tmp]>=1,不会出现负数cnt[tmp]--;if (cnt[tmp] == 0){cnt.erase(tmp);}}//j是最后一个单词的第一个字符if (j >= i + (m - 1) * len){if (cnt == mp){ans.push_back(j - (m - 1) * len);}}}}return ans;}
};

这篇关于LeeCode 30的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137305

相关文章

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)「首先来看看目前已有的资料,还会不断更新哦~一次购买,后续不会再被收费哦,保证是全网最全资源,随着后续内容更新,价格会上涨,越早购买,价格越低,让大家再也不需要到处买断片资料啦~💰💸👋」�

JobScheduler 调用导致的运行时长30分钟的功耗问题

一、SDK 的使用情况与功耗影响 案例是否导致功耗变大onStartJob return true 且子线程没有调用jobFinished()告知系统功耗变大,最长带来30分钟的partial wakelock 长持锁onStartJob return true 且子线程调用jobFinished()告知系统功耗有影响,主要线程执行时长,标准是30秒内onStartJob return fals

嵌入式面试经典30问:一

什么是嵌入式系统? 嵌入式系统是指嵌入到某个对象体系中的专用计算机系统,它负责执行特定的任务,具有专用性、隐蔽性、资源受限和可靠性要求高等特点。通常包括硬件和软件两部分,硬件以微处理器为核心,软件则负责控制和管理硬件资源,实现特定的应用功能。 嵌入式系统和普通计算机系统有什么区别? 嵌入式系统与普通计算机系统的主要区别在于目的、资源、性能和成本等方面。嵌入式系统通常针对特定应用设计,具有体积小

【IEEE出版】2024博鳌新型电力系统国际论坛——电力系统与新能源技术创新论坛(NPSIF 2024,10月30-11月1)

2024博鳌新型电力系统国际论坛——电力系统与新能源技术创新论坛将于2024年10月30-11月1日于海南博鳌举办。 会议的历史悠久,致力于促进电力系统领域的研究和开发活动,同时也着眼于促进全球各地研究人员、开发人员、工程师、学生和从业人员之间的科学信息交流,推动新能源技术的创新和应用,为全球能源领域的可持续发展贡献力量。期待着各方专家学者的共同参与和卓越贡献,共同开创电力系统未来的新篇章。

涉密电脑插U盘会不会被发现?如何禁止涉密电脑插U盘?30秒读懂!

在涉密电脑插U盘的那一瞬间,你是否也好奇会不会被发现?涉密电脑的安全监控可是滴水不漏的!想知道如何彻底禁止涉密电脑插U盘?简单几招搞定,轻松锁死外部设备,信息安全无懈可击! 涉密电脑插U盘会不会被发现? 涉密电脑是否会在插入U盘时被发现,需要根据具体情况来判断。在一些情况下,涉密电脑可能没有安装任何监控软件或安全工具,插入U盘可能不会立即触发警告。然而,随着信息安全管理的不断升级,越来越多

【anaconda 环境搭建】环境搭建python快速30分钟

1、下载anaconda https://repo.anaconda.com/archive/index.html 选择下载 Anaconda3-2019.10-Linux-x86_64.sh 2、安装linux 工具4个,上传,下载,解压,打包 yum install zip yum install unzip yum install lrzsz Yum install wget 3、r