LeetCode-30-串联所有单词的子串

LeetCode第30题:串联所有单词的子串 LeetCode第30题:串联所有单词的子串 题目:给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。 解法一:也想过先确定单词组合后的子串长度,然后从字符串中截取,再判断截取的到的子串是否符合要求,但是感觉这个过... 阅读详情

题目

来源:LeetCode.

给定一个字符串 s 和一些 长度相同 的单词 words 。
找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。

示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]

示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]

提示:

  • 1 < = s . l e n g t h < = 104 1 <= s.length <= 104 1<=s.length<=104
  • s s s 由小写英文字母组成
  • 1 < = w o r d s . l e n g t h < = 5000 1 <= words.length <= 5000 1<=words.length<=5000
  • 1 < = w o r d s [ i ] . l e n g t h < = 30 1 <= words[i].length <= 30 1<=words[i].length<=30
  • w o r d s [ i ] words[i] words[i] 由小写英文字母组成

接下来看一下解题思路:

思路:滑动窗口:

    因为单词长度是固定的,所以可以维护一个单词长度的窗口,在主串滑动查找匹配项。
    可以通过 m a p map map来记录,首先将单词以及出现的次数记录到 m a p map map里,
    然后根据单词的大小依次从主串上截取单词长度的字符串,然后记录到 tmp_map 里;
    如果匹配,移动窗口右边界,并统计次数count++;
    如果不匹配,移动窗口左边界,count–; 。
    一次遍历完,如果 c o u n t count count和单词数相等,就记录左边界的位置,即为匹配的初始位置;

public static List<Integer> findSubstring(String s, String[] words) {
    List<Integer> list = new ArrayList<>();
    // 如果字符串或者单词有一个为空,直接返回
    if (s == null || words == null || s.length() <= 0 || words.length <= 0) {
        return list;
    }

    // 用于存储单词的 map
    HashMap<String, Integer> map = new HashMap<>(words.length);

    // 统计单词的数量,重复的累加
    for (String word : words) {
        // 如果字符串中不包含 单词,直接返回
        if (s.indexOf(word) < 0) {
            return list;
        }
        // map中保存每个单词,和它出现的次数
        map.put(word, map.getOrDefault(word, 0) + 1);
    }

    int one_word_len = words[0].length();
    int word_num = words.length;
    int words_len = one_word_len * word_num;

    // 主串s长度小于单词总和,返回空
    if (words_len > s.length()) {
        return list;
    }

    // 单词长度相等
    // 每次进行匹配的窗口大小为 words_len,每次后移一个单词长度,由左右窗口维持当前窗口位置
    for (int i = 0; i < one_word_len; ++i) {
        int left = i;
        int right = i;
        int count = 0;
        // 用于存放从字符串中取出的单词
        HashMap<String, Integer> tmp_map = new HashMap<>();
        // 右窗口不能超出主串长度
        while (right + one_word_len <= s.length()) {
            // 得到一个单词
            String w = s.substring(right, right + one_word_len);
            // 右窗口右移
            right += one_word_len;
            // words[]中没有这个单词,那么当前窗口肯定匹配失败,直接右移到这个单词后面
            if (!map.containsKey(w)) {
                left = right;
                // 符合要求的单词数清0
                count = 0;
                // 窗口内单词统计map清空,重新统计
                tmp_map.clear();
            } else {
                // 统计当前子串中这个单词出现的次数
                tmp_map.put(w, tmp_map.getOrDefault(w, 0) + 1);
                ++count;
                // 如果这个单词出现的次数大于words[]中它对应的次数
                while (tmp_map.getOrDefault(w, 0) > map.getOrDefault(w, 0)) {
                    String t_w = s.substring(left, left + one_word_len);
                    tmp_map.put(t_w, tmp_map.getOrDefault(t_w, 0) - 1);
                    // 符合的单词数减一
                    --count;
                    // 左窗口位置右移
                    left += one_word_len;
                }
                if (count == word_num) {
                    list.add(left);
                }
            }
        }
    }
    return list;
}
Leetcode30——串联所有单词的子串 题目 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。   示例 1: 输入: s = "barfoothefoobarman... 阅读详情

相关推荐

利用python 完成leetcode30 串联所有单词的子串

给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。 示例 1: 输入: s = “barfoothefoobarman”, words = [“foo”,“bar”] 输出:[0,9] 解释: 从索引 0 和 9 ...

找到工作之前一天十篇的博客 1308

leetcode 子串(列出所有子串,无重复子串,重复子串)

1、列出字符串的所有子串 void getAllSubstring(string s,vector&lt;string&gt; &amp;res){ for (int i = 0; i &lt; s.size(); i++){ for (int j = 1; j &lt;= s.size()-i; j++){ res.emplace(s.substr(i, j)); } } ...

liugg2016的博客 7079

【困难】力扣算法题解析LeetCode30:串联所有单词的子串

本文提出了一种高效查找字符串中所有单词串联子串起始索引的算法。该算法通过预处理将单词映射为数字ID,并使用滑动窗口技术优化匹配过程。核心思路包括:1) 将单词转换为ID减少字符串操作;2) 预处理字符串中所有位置的单词ID;3) 采用滑动窗口动态维护匹配状态。

ylumwd的博客 935

给定一个字符串s和一些长度相同的单词words。找出s中恰好可以由words中所有单词串联形成的子串的起始位置。你可以假设words中的所有单词长度都相同。

这是因为在s中,从索引0开始的子串"barfoo"和从索引9开始的子串"foobar"恰好由words中的所有单词串联形成。为了减少不必要的检查,我们只需要在0到wordLength-1的范围内开始滑动窗口,其中wordLength是数组words中单词的长度。对于每个窗口,使用另一个哈希映射统计窗口中每个单词的出现次数,然后与words的哈希映射进行比较,看是否完全匹配。由于所有单词的长度相同,我们可以使用滑动窗口的方式,以单词的长度为步长在原字符串s上滑动,检查每个可能的窗口。

努力的小方的博客 1083

SQLSTATE58030

在优化一条SQL的时候遇到了执行错误 gtlions =# select t1.telnumber,t2.ua,t2.url,t1.apply_name,t2.apply_name from tb1 t1 gtlions -# left outer join tb2 t2 on t1.sid = t2.ipsid gtlions-# where t1.sum_date=20141128 a

Gtlions Tracker 3658

故障诊断 | CNN-BiGRU-Attention故障诊断

故障诊断 | CNN-BiGRU-Attention故障诊断

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 673

LeetCode 30. Substring with Concatenation of All Words C++(Hash Table)

You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters. 给定一个字符串 s 和一些长度相同的单词 w

ganlanA的博客 263

21、使用 FastHenry 进行片上电感器的模拟与参数预测

本文介绍了使用 FastHenry 对片上电感器进行模拟和参数预测的方法。讨论了 FastHenry 的适用场景、线圈几何形状的选择与离散化方法,以及如何考虑模拟中的寄生效应。同时对比了 FastHenry 和 Magnet 在不同基板电阻率下的模拟精度,并提出了优化电感器设计的策略,为高效准确地预测电感参数提供了技术指导。

y9z0a1b的博客 292

Algorithm:串联所有单词的子串

给定一个字符串s和一些 长度相同 的单词words 。找出 s 中恰好可以由words 中所有单词串联形成的子串的起始位置。 注意子串要与words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑words中单词串联的顺序。 示例 1: 输入:s = "barfoothefoobarman", words = ["foo","bar"] 输出:[0,9] 解释: 从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。 输出的顺序不重要, [9,0] 也...

xikangsoon的博客 580

车载ECU底软测试:方法与技术的深度解析

底软是运行在 ECU 硬件平台上的基础软件,它为上层应用程序提供了硬件驱动、操作系统服务、通信协议栈等功能。底软的主要功能包括:硬件驱动:负责与 ECU 的各种硬件外设进行通信和控制,如 GPIO、UART、SPI、CAN 等。操作系统服务:提供任务调度、内存管理、中断处理等功能,确保系统的实时性和稳定性。通信协议栈:实现 ECU 与其他 ECU 或外部设备之间的通信,如 CAN、LIN、FlexRay 等。诊断服务:负责对 ECU 的故障进行诊断和处理,并将故障信息存储在故障码存储器中。

天赐好车的博客 1422

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称:本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集,用于评估构音障碍患者的语音可理解性。这些新特征在说话人无关的情况下表现良好,能够更好地处理不同说话人的变异性。背景介绍:数据集:特征提取:实验设置:结果:本文提出的新特征集在说话人无关的构音障碍可理解性分类任务中表现出色,特别是在低可理解性和高可理解性类别上。未来的工作将集中在减少低可理解性和中可理解性类别之间的混淆,以进一步提高系

帅小柏的博客 452

Leetcode 30 串联所有单词的子串

Leetcode 30 串联所有单词的子串 我的 leetcode 代码仓库 题目描述 Leetcode题目地址:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/ 给定一个字符串 s 和一些长度相同的单词 **words。**找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。...

隔壁家的二大爷 2582

Python控制程控电源(USB)

随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制,控制电源上下电,监听电源电流、电压等,以下就以常见的艾德克斯程控电源为例,分享如何通过USB连接方式Python语言来控制程控电源。

测试领域技术分享 2865

力扣(LeetCode 30)串联所有单词的子串

题目 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。 示例 1: 输入: s = “barfoothefoobarman”, words = [“foo”,“bar”] 输出:[0,9] 解释: 从索引 0 和...

qq_41318002的博客 371

第 0 篇|开篇:为什么我们要从 RNN 讲到 Transformer?

本文介绍了NLP模型的发展历程,从早期规则式方法到如今Transformer模型的演进脉络。文章强调理解NLP技术需要从基础模型入手,重点分析了传统机器学习的局限性(无法处理变长有序输入和深层语义关联),以及RNN如何通过循环结构首次实现顺序依赖捕捉。作者指出Transformer之所以成为主流,是因为它通过自注意力机制解决了RNN的核心痛点(低效串行处理和长距离依赖问题)。专栏将采用"从问题到解决方案"的讲解方式,帮助读者建立完整的NLP知识体系,避免孤立学习和盲目追新。全文旨在为初学

记录 IT 领域经验与见解的博客 73

嵌入式硬件中AI硬件设计方法与技巧

嘉立创EDA推出AI助手Kimi插件,为PCB设计提供智能支持。该插件具备四大核心功能:AI问答助手可解答各类电路设计问题;元件查询功能直接展示参数和应用场景;智能分析网表可检测潜在问题;电路图识别能解析图纸结构并提供改进建议。用户需通过扩展插件安装,并配置Kimi API密钥后使用。该工具旨在提升工程师的设计效率,减少查阅资料时间,特别适合项目交接和设计自查场景。

嵌入式技术开发 1863

30. 串联所有单词的子串【 力扣(LeetCode) 】

给定一个字符串 s 和一个字符串数组 words。words 中所有字符串 长度相同。s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words = [“ab”,“cd”,“ef”], 那么 “abcdef”, “abefcd”,“cdabef”, “cdefab”,“efabcd”, 和 “efcdab” 都是串联子串。“acdbef” 不是串联子串,因为他不是任何 words 排列的连接。返回所有串联子串在 s 中的开始索引。

yyh520025的博客 1271

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LeetCode 力扣官方题解 | 30. 串联所有单词的子串

初始化 differ 时,出现在窗口中的单词,每出现一次,相应的值增加 1 ,出现在 words 中的单词,每出现一次,相应的值减少 1。窗口移动时,若出现 differ 中值不为 0 的键的数量为 0 ,则表示这个窗口中的单词频次和 words 中单词频次相同,窗口的左端点是一个待求的起始位置。记 words 的长度为 m,words 中每个单词的长度为 n,s 的长度为 ls。空间复杂度:O(m×n),其中 m 是 words 的单词数,n 是 words 中每个单词的长度。

weixin_44071377的博客 453

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

30. 串联所有单词的子串 - 力扣(LeetCode)

它是 words 中以 ["the","foo","bar"] 顺序排列的连接。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。它是 words 中以 ["bar","foo"] 顺序排列的连接。子串 "foobar" 开始位置是 9。它是 words 中以 ["foo","bar"] 顺序排列的连接。Java:方法、集合、泛型、逻辑运算符、if else判断、for循环、while循环。

it爱好者的学习之路 1262

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

力扣30.串联所有单词的子串(python)

给定一个字符串s和一个字符串数组wordswords中所有字符串。s中的是指一个包含words中所有字符串以任意顺序排列连接起来的子串。"abcdef""abefcd""cdabef""cdefab""efabcd""efcdab""acdbef"words返回所有串联子串在s中的开始索引。你可以以返回答案。[0,9]因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。子串 "barfoo" 开始位置是 0。

2403_86623082的博客 1231

力扣30题:串联所有单词的子串

它是 words 中以 ["the","foo","bar"] 顺序排列的连接。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。它是 words 中以 ["bar","foo"] 顺序排列的连接。它是 words 中以 ["foo","bar"] 顺序排列的连接。

Xzh0423的博客 718

力扣字符串第30题 串联所有单词的子串java

题目要求找到字符串 s 中所有包含 words 数组所有单词的串联子串的起始索引。words 中的单词长度相同,且串联子串可以是任意顺序排列。通过滑动窗口和哈希表技术,可以高效解决该问题。首先,统计 words 中每个单词的出现次数,存入哈希表 wordMap。然后,遍历 s 的每个可能的起始偏移,使用滑动窗口检查子串是否匹配 wordMap 中的单词及其次数。若匹配,则记录起始索引。最终返回所有符合条件的起始索引。该方法的时间复杂度为 O(n * m),其中 n 为 s 的长度,m 为 words 中单词

2301_81624621的博客 554

力扣30. 串联所有单词的子串

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。

dastatham的博客 748

【算法笔记】LeetCode_30 串联所有单词的子串

这些情况下,滑动窗口方法的时间复杂度为O(n),其中n为字符串的长度,而遍历字符串方法的时间复杂度为O(n*m),其中m为单词列表的长度。这个问题最开始的想法是暴力破解,遍历字符串中的所有字符,以每个字符为起点,截取固定长度的字符串,然后对每个字符串判断是否符合要求,其最坏情况下的时间复杂度是O(m * n),m是字符串的长度,n是数组的元素数量。它是 words 中以 [“bar”,“foo”] 顺序排列的连接。[“bar”,“the”,“foo”] 顺序排列的连接。3,所以串联子串的长度必须为 9。

weixin_45568812的博客 1005

LeetCode 30:串联所有单词的子串

给定字符串s和单词数组words(所有单词长度相同),需找出s中所有由words中单词而成的子串的起始索引。

m0_75126572的博客 1105

Leetcode力扣题解 - 30.串联所有单词的子串

一名优秀的程序员,在穿越单行道时也会确认双向的来车情况。假设字符串="barfoothefoobarman",关键词=["foo","bar"]。当关键词遍历完成后,如果哈希表中所有值都为0说明此时的字符串与关键词都匹配上了,否则就是没有匹配上。如果匹配成功,在返回的数组中保存起始位置即可。直到走到(字符串长度-关键词总长)的位置停止,这里都是3,所以把此时的字符串barfoo分成bar、foo两个部分装入哈希表中,在第一趟中,需要匹配的是barfoo,此时我们创建一个哈希表。...

weixin_61857742的博客 550
上一篇: LeetCode-29-两数相除
下一篇: LeetCode-31-下一个排列
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值