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

力扣hot100:找到字符串中所有字母异位词(滑动窗口 + 字符频率数组)(438)

题目描述

解题思路

使用滑动窗口配合字符频率数组高效解决问题:

  1. 字符频率数组:统计 p 中每个字符的出现频次。
  2. 滑动窗口:在 s 上维护一个长度等于 p 的窗口,动态统计窗口内字符频次。
  3. 频次匹配:当窗口的字符频次与 p 的频次完全一致时,记录窗口起始索引。

优化点

  • 跳过字符串转列表操作,直接操作字符串降低开销。
  • 避免无效比较:仅当窗口长度达到 p 的长度时才进行频次比对。
代码实现
public List<Integer> findAnagrams(String s, String p) {List<Character> s_list = s.chars().mapToObj(c->(char)c).collect(Collectors.toList());List<Character> p_list = p.chars().mapToObj(c->(char)c).collect(Collectors.toList());List<Integer> result=new ArrayList<>();int length=s_list.size();// 改进的滑动窗口实现int pLen = p_list.size();if (s_list.size() < pLen) return result;// 创建字符频率数组int[] pCount = new int[26];int[] windowCount = new int[26];// 统计p中字符频率for (char c : p_list) {pCount[c - 'a']++;}// 滑动窗口for (int i = 0; i < s_list.size(); i++) {// 添加右边字符到窗口windowCount[s_list.get(i) - 'a']++;// 如果窗口大小超过p的长度,移除左边字符if (i >= pLen) {windowCount[s_list.get(i - pLen) - 'a']--;}// 比较窗口和p的字符频率if (Arrays.equals(pCount, windowCount)) {result.add(i - pLen + 1);}}return result;}

算法解析
  1. 初始化频率数组

    • pCount 记录 p 的字符频次,window 动态记录窗口内字符频次。
  2. 滑动窗口操作

    • 右扩:遍历 s,将当前字符加入窗口(window 对应位置 +1)。
    • 左缩:当窗口长度超过 p 时,移除窗口最左侧字符(window 对应位置 -1)。
  3. 匹配判断

复杂度分析
  • 时间复杂度O(n),其中 n 是 s 的长度。每个字符被操作两次(加入和移除窗口),频次比较操作可忽略(固定26次)。
  • 空间复杂度O(1),仅使用固定大小的频率数组(长度26)。
关键点总结
  • 滑动窗口:动态维护窗口内字符频次,避免重复计算。
  • 边界处理:及时移除窗口左侧字符,确保长度始终 ≤ p
  • 性能优化:直接操作字符串代替转列表,减少不必要比较。

通过滑动窗口 + 字符频次数组,高效解决字母异位词子串搜索问题,适合处理字符串匹配类题目!

http://www.dtcms.com/a/339209.html

相关文章:

  • Java实现一个加法运算
  • 《Java 多线程全面解析:从基础到生产者消费者模型》
  • 基于Paddle和YOLOv5实现 车辆检测
  • Markdown to PDF/PNG Converter
  • 浅看架构理论(二)
  • 儒释道中的 “不二” 之境:超越对立的智慧共鸣及在软件中的应用
  • Linux的基本操作
  • AC 内容审计技术
  • UE5 使用RVT制作地形材质融合
  • 【LeetCode】3655. 区间乘法查询后的异或 II (差分/商分 + 根号算法)
  • 部署Qwen-Image
  • 【AAOS】Android Automotive 16模拟器源码下载及编译
  • 【LeetCode题解】LeetCode 153. 寻找旋转排序数组中的最小值
  • HJ2 计算某字符出现次数
  • C语言关于函数传参和返回值的一些想法2(参数可修改的特殊情况)
  • 从数据孤岛到实时互联:Canal 驱动的系统间数据同步实战指南
  • 在职老D渗透日记day21:sqli-labs靶场通关(第27a关)get联合注入 过滤select和union “闭合
  • C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述)
  • Milvus 向量数据库中的索引类型
  • SQL 语句进阶实战:从基础查询到性能优化全指南
  • K8s命名空间:资源隔离与管理的核心
  • 轻量级milvus安装和应用示例
  • 一文精通 Swagger 在 .NET 中的全方位配置与应用
  • 软件测试-Selenium学习笔记
  • Dify-MCP服务创建案例
  • 循环高级综合练习①
  • 46 C++ STL模板库15-容器7-顺序容器-双端队列(deque)
  • 人工智能统一信息结构的挑战与前景
  • Vue3编程中更多常见书写错误场景
  • 使用OpenCV计算灰度图像的质心