【Leecode】Leecode刷题之路第30天之串联所有单词的子串

题目出处

30-串联所有单词的子串-题目出处

题目描述

个人解法

思路:

java 复制代码
1.找出所有words的排列组合
2.然后判断如上排列组合是否属于s的子串

代码示例:(Java)

java 复制代码
todo

复杂度分析

java 复制代码
todo

官方解法

30-串联所有单词的子串-官方解法

方法1:滑动窗口

思路:

代码示例:(Java)

java 复制代码
public class Solution1 {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> res = new ArrayList<Integer>();
        int m = words.length, n = words[0].length(), ls = s.length();
        for (int i = 0; i < n; i++) {
            if (i + m * n > ls) {
                break;
            }
            Map<String, Integer> differ = new HashMap<String, Integer>();
            for (int j = 0; j < m; j++) {
                String word = s.substring(i + j * n, i + (j + 1) * n);
                differ.put(word, differ.getOrDefault(word, 0) + 1);
            }
            for (String word : words) {
                differ.put(word, differ.getOrDefault(word, 0) - 1);
                if (differ.get(word) == 0) {
                    differ.remove(word);
                }
            }
            for (int start = i; start < ls - m * n + 1; start += n) {
                if (start != i) {
                    String word = s.substring(start + (m - 1) * n, start + m * n);
                    differ.put(word, differ.getOrDefault(word, 0) + 1);
                    if (differ.get(word) == 0) {
                        differ.remove(word);
                    }
                    word = s.substring(start - n, start);
                    differ.put(word, differ.getOrDefault(word, 0) - 1);
                    if (differ.get(word) == 0) {
                        differ.remove(word);
                    }
                }
                if (differ.isEmpty()) {
                    res.add(start);
                }
            }
        }
        return res;
    }


}

复杂度分析

  • 时间复杂度:O(ls×n),其中 ls 是输入 s 的长度,n 是 words 中每个单词的长度。需要做 n 次滑动窗口,每次需要遍历一次 s。
  • 空间复杂度:O(m×n),其中 m 是 words 的单词数,n 是 words 中每个单词的长度。每次滑动窗口时,需要用一个哈希表保存单词频次。

考察知识点

收获

Gitee源码位置

30-串联所有单词的子串-源码

同名文章,已同步发表于CSDN,个人网站,公众号

相关推荐
才疏学浅7431 分钟前
批量下载鹏程实验室数据的方法
java·开发语言·word
bubiyoushang8883 分钟前
基于 TGLVM 算法的迁移学习分类系统
算法·分类·迁移学习
皮卡祺q8 分钟前
【JVM】:类加载机制,jvm内存布局,垃圾回收,String 不可变性源码分析
java·开发语言·jvm·多线程·string
JAVA面经实录91711 分钟前
Java核心底层原理全集(终版无遗漏·生产级PDF)
java·开发语言·学习
java修仙传12 分钟前
实习日志:完成算法调用总接口并修复联调问题
java·开发语言·数据库
铅笔小新z12 分钟前
【Linux】进程间通信(IPC)
java·linux·运维
Rabitebla13 分钟前
深入理解 C++ STL:stack 和 queue 的底层原理与实现
c语言·开发语言·数据结构·c++·算法
极客先躯14 分钟前
高级java每日一道面试题-2025年12月11日-实战篇[Docker]-如何配置 Docker 的资源限制(CPU、内存、磁盘)?
java·docker·如何配置docker的资源限制·资源限制的底层支柱·linux cgroups·cpu 限制·从逻辑到策略
通信仿真爱好者22 分钟前
【无标题】
人工智能·算法·机器学习
總鑽風24 分钟前
单点登录sso 微服务加网关gateway
java·微服务·gateway·jwt·单点登录