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

秦皇岛外贸网站建设哪家小吃培训网站做的最好

秦皇岛外贸网站建设,哪家小吃培训网站做的最好,余姚网站公司,建设银行360网站登录不了Leetcode 30. 串联所有单词的子串 是一道经典的字符串滑动窗口问题。这题考察字符串切分、哈希表匹配以及滑动窗口的灵活应用。解题难度较高,需要对循环和判断逻辑有良好的掌握。 题目描述 给定一个字符串 s 和一组长度都相同的单词数组 words,找出 s 中…

Leetcode 30. 串联所有单词的子串 是一道经典的字符串滑动窗口问题。这题考察字符串切分、哈希表匹配以及滑动窗口的灵活应用。解题难度较高,需要对循环和判断逻辑有良好的掌握。


题目描述

给定一个字符串 s 和一组长度都相同的单词数组 words,找出 s 中恰好可以由数组中所有单词连接在一起的连续子字符串的起始索引。这些单词在子字符串中可以以任意顺序排列,但每个单词必须完全匹配。


示例

输入: s = "barfoothefoobarman", words = ["foo","bar"]
输出: [0,9]
解释: 子串是 "barfoo" 和 "foobar",它们的起始索引分别为 0 和 9。输入: s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出: []输入: s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出: [6,9,12]

解法 1:滑动窗口法

思路

将问题转化为固定宽度为 totalLen = words.length * wordLen 的滑动窗口问题:

  1. 窗口大小:
    • 由于单词长度都一样,窗口的大小固定为 totalLen
    • 可以遍历 s 的每个可能起点,从中截取长度为 totalLen 的窗口。
  2. 匹配机制:
    • 用一个 HashMap 记录 words 中每个单词的频次 (wordFreq)。
    • 每个窗口逐个截取长度为 wordLen 的单词片段,统计其出现频次 (currentFreq)。
    • 如果当前窗口内所有单词的出现频次完全匹配 wordFreq,则当前窗口为有效窗口。
  3. 滑动优化:
    • 滑动窗口通常从左到右依次移动,通过减少重新计算提升效率。

代码模板

import java.util.*;class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> result = new ArrayList<>();if (s == null || s.length() == 0 || words == null || words.length == 0) {return result;}int wordLen = words[0].length(); // 单词长度int totalLen = wordLen * words.length; // 总窗口长度// 单词频次统计Map<String, Integer> wordFreq = new HashMap<>();for (String word : words) {wordFreq.put(word, wordFreq.getOrDefault(word, 0) + 1);}// 滑动窗口for (int i = 0; i < wordLen; i++) { // 启动多个滑动窗口int left = i, right = i, count = 0;Map<String, Integer> currentFreq = new HashMap<>();while (right + wordLen <= s.length()) {String word = s.substring(right, right + wordLen);right += wordLen;// 处理当前单词if (wordFreq.containsKey(word)) {currentFreq.put(word, currentFreq.getOrDefault(word, 0) + 1);count++;// 如果某单词超出频次限制,缩小窗口while (currentFreq.get(word) > wordFreq.get(word)) {String leftWord = s.substring(left, left + wordLen);currentFreq.put(leftWord, currentFreq.get(leftWord) - 1);left += wordLen;count--;}// 检查是否完全匹配if (count == words.length) {result.add(left);}} else {// 非法单词,重置窗口状态currentFreq.clear();count = 0;left = right;}}}return result;}
}

复杂度分析

  • 时间复杂度:
    • 单词数为 n,单词长度为 wordLen,字符串长度为 m
    • 滑动窗口遍历最多 m / wordLen 次,每次窗口内的频率判断需要 O(n)。
    • 总时间复杂度为 O(m * n / wordLen)
  • 空间复杂度: O(n)
    • 需要存储 wordFreqcurrentFreq 两个 HashMap。

适用场景

  • 适用于输入字符串较大,但单词数量较少的情况。
  • 高效处理,能够正确识别多种模式。

解法 2:分块扫描

思路

  • 类似滑动窗口,但优化起点扫描的策略。由于单词长度固定,字符串可以按照 wordLen 等分。
  • 对每个可能的起点进行独立的分块滑动扫描,减少重复逻辑。

代码模板

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> result = new ArrayList<>();if (s == null || s.length() == 0 || words == null || words.length == 0) {return result;}int wordLen = words[0].length();int totalLen = wordLen * words.length;if (s.length() < totalLen) {return result;}Map<String, Integer> wordFreq = new HashMap<>();for (String word : words) {wordFreq.put(word, wordFreq.getOrDefault(word, 0) + 1);}for (int i = 0; i < wordLen; i++) {Map<String, Integer> currentFreq = new HashMap<>();int left = i, count = 0;for (int right = i; right + wordLen <= s.length(); right += wordLen) {String word = s.substring(right, right + wordLen);if (wordFreq.containsKey(word)) {currentFreq.put(word, currentFreq.getOrDefault(word, 0) + 1);count++;while (currentFreq.get(word) > wordFreq.get(word)) {String removedWord = s.substring(left, left + wordLen);currentFreq.put(removedWord, currentFreq.get(removedWord) - 1);count--;left += wordLen;}if (count == words.length) {result.add(left);}} else {currentFreq.clear();count = 0;left = right + wordLen;}}}return result;}
}

复杂度分析

  • 时间复杂度: O(m * n / wordLen)。
  • 空间复杂度: O(n) (存储单词字典)。

解法 3:暴力法

思路

  1. 枚举字符串的所有子串,判断是否等于 words 的任意排列。
  2. 将字符串切分为固定大小的单词并比较频次。

代码模板

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> result = new ArrayList<>();if (s == null || s.length() == 0 || words == null || words.length == 0) {return result;}int wordLen = words[0].length();int totalLen = wordLen * words.length;Map<String, Integer> wordFreq = new HashMap<>();for (String word : words) {wordFreq.put(word, wordFreq.getOrDefault(word, 0) + 1);}for (int i = 0; i <= s.length() - totalLen; i++) {String sub = s.substring(i, i + totalLen);Map<String, Integer> currentFreq = new HashMap<>();boolean isValid = true;for (int j = 0; j < sub.length(); j += wordLen) {String word = sub.substring(j, j + wordLen);currentFreq.put(word, currentFreq.getOrDefault(word, 0) + 1);if (!wordFreq.containsKey(word) || currentFreq.get(word) > wordFreq.get(word)) {isValid = false;break;}}if (isValid) {result.add(i);}}return result;}
}

复杂度分析

  • 时间复杂度: O(m * n)
    • 对于每个起点,我们需要遍历每个单词,再比较频次。
  • 空间复杂度: O(n)

快速 AC 策略

  1. 首选滑动窗口法 (解法 1):
    • 时间效率高,代码清晰,非常适合面试中快速实现。
  2. 可以考虑分块扫描 (解法 2):
    • 针对特定输入大小,可以优化性能。
  3. 避免使用暴力法 (解法 3):
    • 尽管清晰直观,但性能差,不适合大规模输入。

在面试或实际开发中,熟练掌握滑动窗口模板,能够快速解决这类问题!


文章转载自:

http://mE4RU6tL.mpsnb.cn
http://L5Jf7M9y.mpsnb.cn
http://gB9DyzwL.mpsnb.cn
http://wem6Odwa.mpsnb.cn
http://X7TRuR7V.mpsnb.cn
http://eSXmlnCD.mpsnb.cn
http://24L2CVRf.mpsnb.cn
http://IHsTLdjt.mpsnb.cn
http://YIGLQEWJ.mpsnb.cn
http://PUjL0QsZ.mpsnb.cn
http://OO1RpIXD.mpsnb.cn
http://nj68q0tI.mpsnb.cn
http://oxFm5UwG.mpsnb.cn
http://izJtKOkY.mpsnb.cn
http://uYpjKRMS.mpsnb.cn
http://owQQZGuZ.mpsnb.cn
http://iPgjtb4Q.mpsnb.cn
http://jzUeRqvn.mpsnb.cn
http://9mmK7jSN.mpsnb.cn
http://sFnndVG2.mpsnb.cn
http://B5VkwxE9.mpsnb.cn
http://DjuDXMhn.mpsnb.cn
http://2AgOElA5.mpsnb.cn
http://YragrDQz.mpsnb.cn
http://9LYBqOKc.mpsnb.cn
http://5Zq6Xltz.mpsnb.cn
http://SWWiZxlJ.mpsnb.cn
http://wWGrTYVX.mpsnb.cn
http://AAauzWRH.mpsnb.cn
http://9mkJ2Gs4.mpsnb.cn
http://www.dtcms.com/wzjs/611616.html

相关文章:

  • 携程官网seo优化报告
  • 厦门seo网络推广手机优化游戏性能的软件
  • 网站做淘客 还可以吗典型的口碑营销案例
  • 哪个平台可以随便发广告网站如何做标题优化
  • 网站建设价格对比单长沙优化网站关键词
  • 水土保持与生态建设网站怎么申请免费网站
  • 备案 网站建设计划书wordpress前台发布
  • 如何做网站卖连接注册建筑工程公司起名大全
  • wordpress 积分购买网络培训seo
  • 创业网站怎么做厦门南希网站建设
  • 做网站用jsp还是html策划案推广
  • 如何做网站网页免费wordpress登陆ip唯一
  • python 网站建设 拖拽式虚拟主机网站
  • 怎么建设局域网站手机壳定制网站制作
  • 网站获取访客qq号码平谷做网站
  • dw中旅游网站怎么做wordpress 文章分类列表
  • 青岛网站推广手机影视网站制作
  • 可信赖的深圳网站建设用wordpress做什么内容
  • 东莞家具行业营销型网站建设多少钱网站开发怎样建立后台数据
  • 微信公众号和微网站wordpress用户可以互加好友
  • 版式设计图片郑州seo网站排名优化公司
  • 手机 做网站wordpress入站密码
  • 做网站设计的都转行干啥了成都旅游景点攻略
  • 分销系统网站湖南网站备案要多少天
  • 网站免费正能量直接进入在线软文投稿平台有哪些
  • 怎么做免费的网站商城百度一下百度一下百度一下
  • 成都免费建网站机关单位网站建设工作方案
  • 如何做企业网站做网站需要先买域名吗
  • 学校网站建设需要注意什么房产交易中心官网
  • 企业网站主页 优帮云温州企业模板建站