力扣面试150 串联所有单词的子串 分组滑动窗口

Problem: 30. 串联所有单词的子串

参考题解


滑动窗口

Java 复制代码
class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        int n = s.length(), m = words.length, w = words[0].length();
        // 统计 words 中「每个目标单词」的出现次数
        Map<String, Integer> map = new HashMap<>();
        for (String str : words)
            map.put(str, map.getOrDefault(str, 0) + 1);

        List<Integer> ans = new ArrayList<>();
        for (int i = 0; i < w; i++) {
            // 构建一个当前子串对应的哈希表,统计当前子串中「每个目标单词」的出现次数
            Map<String, Integer> temp = new HashMap<>();
            // 滑动窗口的大小固定是 m * w,每次将下一个单词添加进 temp,上一个单词移出 temp
            for (int j = i; j + w <= n; j += w) {
                String cur = s.substring(j, j + w);
                temp.put(cur, temp.getOrDefault(cur, 0) + 1);
                if (j >= i + (m * w)) { // 说明当前窗口超过了 m 个单词
                    int idx = j - m * w;
                    String prev = s.substring(idx, idx + w);// 移除最左边的单词
                    if (temp.get(prev) == 1)
                        temp.remove(prev);
                    else
                        temp.put(prev, temp.get(prev) - 1);
                    // if (!temp.getOrDefault(prev, 0).equals(map.getOrDefault(prev, 0)))
                    //     continue;
                }
                // if (!temp.getOrDefault(cur, 0).equals(map.getOrDefault(cur, 0)))
                //     continue;
                // 上面两个 continue 可以减少 map 之间的 equals 操作
                if (temp.equals(map))
                    ans.add(j - (m - 1) * w);
            }
        }
        return ans;
    }
}
相关推荐
A尘埃几秒前
物流公司配送路径动态优化(Q-Learning算法)
算法
天若有情6732 分钟前
【自研实战】轻量级ASCII字符串加密算法:从设计到落地(防查岗神器版)
网络·c++·算法·安全·数据安全·加密
xiaoxue..19 分钟前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
啊森要自信38 分钟前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹1 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事1 小时前
简单模板笔记
数据结构·笔记·算法
YuTaoShao1 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头1 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa2 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior2 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪