博客
关于我
【滑动窗口法】—— 438. 找到字符串中所有字母异位词
阅读量:362 次
发布时间:2019-03-04

本文共 2067 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到字符串 s 中所有是字符串 p 的字母异位词的子串,并返回这些子串的起始索引。字母异位词是指字母相同但排列不同的字符串。

方法思路

为了高效地解决这个问题,我们可以使用滑动窗口技术。滑动窗口技术允许我们在一个固定长度的窗口内高效地统计字符频率,并在每次滑动窗口时进行更新,从而在较短的时间内完成任务。

具体步骤如下:

  • 初始化频率数组:首先,统计字符串 p 中每个字符的频率,存储在 p_counts 数组中。
  • 滑动窗口初始化:初始化当前窗口的频率数组 current_counts,包含字符串 s 的前 m 个字符的频率,其中 mp 的长度。
  • 滑动窗口遍历:遍历字符串 s,每次滑动窗口时,移除左边界字符并加入右边界字符,更新 current_counts
  • 检查匹配:在每次滑动窗口后,检查当前窗口的频率数组是否与 p 的频率数组一致。如果一致,记录起始索引。
  • 这种方法的时间复杂度是 O(n),其中 n 是字符串 s 的长度,空间复杂度是 O(1)(固定 26 个字母)。

    解决代码

    import java.util.ArrayList;import java.util.List;public class Solution_438 {    public List
    findAnagrams(String s, String p) { int m = p.length(); int n = s.length(); List
    res = new ArrayList<>(); if (m > n) { return res; } int[] p_counts = new int[26]; for (int i = 0; i < m; i++) { p_counts[p.charAt(i) - 'a']++; } int[] current_counts = new int[26]; for (int i = 0; i < m; i++) { current_counts[s.charAt(i) - 'a']++; } for (int i = 0; i <= n - m; i++) { // 移除左边界字符 if (i > 0) { char outChar = s.charAt(i - 1); current_counts[outChar - 'a']--; if (current_counts[outChar - 'a'] < 0) { break; } } // 添加右边界字符 int inIndex = i + m; if (inIndex < n) { char inChar = s.charAt(inIndex); current_counts[inChar - 'a']++; } // 检查是否与p_counts匹配 boolean match = true; for (int j = 0; j < 26; j++) { if (current_counts[j] != p_counts[j]) { match = false; break; } } if (match) { res.add(i); } } return res; }}

    代码解释

  • 初始化频率数组p_counts 数组记录 p 中每个字符的频率,current_counts 数组初始化为 p 的前 m 个字符频率。
  • 滑动窗口遍历:遍历字符串 s,每次滑动窗口时,移除左边界字符并更新频率数组,然后加入右边界字符并更新频率数组。
  • 检查匹配:每次滑动窗口后,检查当前窗口的频率数组是否与 p 的频率数组一致。如果一致,记录起始索引。
  • 这种方法确保了在合理的时间复杂度内高效地找到所有符合条件的子串。

    转载地址:http://vser.baihongyu.com/

    你可能感兴趣的文章
    OAuth2 vs JWT,到底怎么选?
    查看>>
    Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_三项内容_Spring Security OAuth2.0认证授权---springcloud工作笔记141
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_授权码模式_Spring Security OAuth2.0认证授权---springcloud工作笔记144
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
    查看>>
    OAuth2.0四种模式的详解
    查看>>
    OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
    查看>>
    oauth2登录认证之SpringSecurity源码分析
    查看>>