【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】

这篇具有很好参考价值的文章主要介绍了【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】,LeetCode每日一题打卡,面试必须掌握的101题,leetcode,散列表,算法,java,面试,滑动窗口,hashmap

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】,LeetCode每日一题打卡,面试必须掌握的101题,leetcode,散列表,算法,java,面试,滑动窗口,hashmap

【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】,LeetCode每日一题打卡,面试必须掌握的101题,leetcode,散列表,算法,java,面试,滑动窗口,hashmap

🚩 题目链接

  • 30. 串联所有单词的子串

⛲ 题目描述

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。

s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。

例如,如果 words = [“ab”,“cd”,“ef”], 那么 “abcdef”, “abefcd”,“cdabef”, “cdefab”,“efabcd”, 和 “efcdab” 都是串联子串。 “acdbef” 不是串联子串,因为他不是任何 words 排列的连接。
返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

示例 1:

输入:s = “barfoothefoobarman”, words = [“foo”,“bar”]
输出:[0,9]
解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
子串 “barfoo” 开始位置是 0。它是 words 中以 [“bar”,“foo”] 顺序排列的连接。
子串 “foobar” 开始位置是 9。它是 words 中以 [“foo”,“bar”] 顺序排列的连接。
输出顺序无关紧要。返回 [9,0] 也是可以的。
示例 2:

输入:s = “wordgoodgoodgoodbestword”, words = [“word”,“good”,“best”,“word”]
输出:[]
解释:因为 words.length == 4 并且 words[i].length == 4,所以串联子串的长度必须为 16。
s 中没有子串长度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回一个空数组。
示例 3:

输入:s = “barfoofoobarthefoobarman”, words = [“bar”,“foo”,“the”]
输出:[6,9,12]
解释:因为 words.length == 3 并且 words[i].length == 3,所以串联子串的长度必须为 9。
子串 “foobarthe” 开始位置是 6。它是 words 中以 [“foo”,“bar”,“the”] 顺序排列的连接。
子串 “barthefoo” 开始位置是 9。它是 words 中以 [“bar”,“the”,“foo”] 顺序排列的连接。
子串 “thefoobar” 开始位置是 12。它是 words 中以 [“the”,“foo”,“bar”] 顺序排列的连接。

提示:

1 <= s.length <= 104
1 <= words.length <= 5000
1 <= words[i].length <= 30
words[i] 和 s 由小写英文字母组成

🌟 求解思路&实现代码&运行结果


⚡ 滑动窗口 + 哈希表

🥦 求解思路
  1. 该题暴力解法肯定是通过不了的,所以,我们需要使用其它的解法。该题是438. 找到字符串中所有字母异位词的进阶版本,依旧是通过滑动窗口+Hash表来解决,只不过该题需要使用词频表来维护单词出现的次数,而基础题维护的是字符出现的次数。
  2. 使用哈希表 wordsMap 记录 words 中每个单词的出现次数
  3. 枚举 s 中的每个字符作为起点,往后取长度为len * n的子串 str
  4. 使用哈希表 strMap 统计 str 每个单词的出现次数(每隔 w 长度作为一个单词)
  5. 比较 wordsMap 和 strMap 是否相同
  6. 实现代码如下所示:
🥦 实现代码
class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> ans = new ArrayList<>();
        HashMap<String, Integer> wordsMap = new HashMap<>();
        int n = words.length, len = words[0].length();
        int total = len * n;
        for (String word : words) {
            wordsMap.put(word, wordsMap.getOrDefault(word, 0) + 1);
        }
        int m = s.length();
        for (int i = 0; i <= m - total; i++) {
            String str = s.substring(i, i + total);
            HashMap<String, Integer> strMap = new HashMap<>();
            for (int j = 0; j < str.length(); j += len) {
                String temp = str.substring(j, j + len);
                if (!wordsMap.containsKey(temp))
                    break;
                strMap.put(temp, strMap.getOrDefault(temp, 0) + 1);
            }
            if (wordsMap.equals(strMap))
                ans.add(i);
        }
        return ans;
    }
}
🥦 运行结果

【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】,LeetCode每日一题打卡,面试必须掌握的101题,leetcode,散列表,算法,java,面试,滑动窗口,hashmap


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】,LeetCode每日一题打卡,面试必须掌握的101题,leetcode,散列表,算法,java,面试,滑动窗口,hashmap

【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】,LeetCode每日一题打卡,面试必须掌握的101题,leetcode,散列表,算法,java,面试,滑动窗口,hashmap文章来源地址https://www.toymoban.com/news/detail-810575.html

到了这里,关于【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 30. 串联所有单词的子串

    题目链接:30. 串联所有单词的子串 代码如下:

    2024年01月18日
    浏览(52)
  • 30. 串联所有单词的子串【memset(hash, 0, sizeof(hash)) 这样的方式真的不要再使用、leetcode有时真的会g的】

    30. 串联所有单词的子串 C代码:滑动窗口、字符串异位段 C代码:失败案例:哈希表保存重复出现

    2024年02月02日
    浏览(39)
  • 【Java刷题篇】串联所有单词的子串

    力扣链接: 串联所有单词的子串 阅读题目后,可以拿到一个关键信息– words中所有字符串长度相等 ,这后续解题思路的一大关键,还有就是串联字串的字符串顺序可以不同。得到这两个关键信息后,我们就很容易联想到运用 滑动窗口 这个算法来解决问题。 好分析完题目后,

    2024年03月22日
    浏览(41)
  • 【LeetCode热题100】【子串】滑动窗口最大值

    题目 给你一个整数数组  nums ,有一个大小为  k   的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的  k  个数字。滑动窗口每次只向右移动一位。 返回  滑动窗口中的最大值  。 示例 1: 示例 2: 提示: 1 = nums.length = 105 -104 = nums[i] = 104 1 =

    2024年01月19日
    浏览(48)
  • 【LeetCode滑动窗口专题#2】无重复字符的最长子串

    #1传送门 滑动窗口最大值 长度最小的子数组 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = \\\"abcabcbb\\\" 输出: 3 解释: 因为无重复字符的最长子串是 \\\"abc\\\",所以其长度为 3。 示例 2: 输入: s = \\\"bbbbb\\\" 输出: 1 解释: 因为无重复字符的最长子串

    2024年02月08日
    浏览(40)
  • 【滑动窗口】leetcode3:无重复字符的最长子串

    无重复字符的最长子串 题目要求我们找符合要求的最长子串,要求是不能包含重复字符 确定一个子串只需确定它的左右区间即可,于是我们可以两层循环暴力枚举所有的子串,找到符合要求的,并通过比较得到最长的长度。还有一个问题,怎么确定有没有重复字符呢?可以

    2024年02月11日
    浏览(31)
  • 【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

    1. 长度最小的子数组 - 力扣(LeetCode) (1)方法一:暴力列举出所有的子数组的和 时间复杂度:O(n**2):枚举所有子数组O(n**2) (2)方法二: 利用 单调性(两个指针都不回退) ,使用\\\" 同向双指针 \\\"(其实就是 滑动窗口 )来优化 那么 滑动窗口过程 是怎么样的? 1le

    2024年03月22日
    浏览(53)
  • 【LeetCode】滑动窗口妙解无重复字符的最长子串

    Problem: 3. 无重复字符的最长子串 首先我们来分析一下本题的思路 如果读者有看过 长度最小的子数组 的话就可以清楚这个子串其实和子数组是一个道理,都是 连续的一段区间 但是呢它们本质上还是存在一定区别的,这里说到是要我们去寻找不含有重复字符的【最长子串】

    2024年02月07日
    浏览(37)
  • 【算法|滑动窗口No.1】leetcode209. 长度最小的子数组

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月08日
    浏览(41)
  • 【Leetcode刷题-Python/C++】长度最小的子数组(滑动窗口)

    209.长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包