leetcode438.找到字符串中所有字母异位词

标签:滑动窗口 双指针

给定两个字符串 s 和 p,找到 s中所有 p的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

示例 1:

复制代码
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

复制代码
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

  • 1 <= s.length, p.length <= 3 * 104
  • s 和 p 仅包含小写字母

思路:典型滑动窗口题目,滑动窗口关键在于窗口左右指针。直接设置p大小滑动窗口,然后将窗口子串和p比较。

leetcode版本:

java 复制代码
   //时间复杂度O(Nmlogm) ,N是s长度,m是p长度
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> findAnagrams = new ArrayList<>();
        int i = 0;
        int j = i + p.length();
        char [] pChars = p.toCharArray();
        Arrays.sort(pChars);
        p = new String(pChars);
        while(j <= s.length()){
            String sub_s = s.substring(i, j);
            char[] temp = sub_s.toCharArray();
            Arrays.sort(temp);
            sub_s = new String(temp);
            if(sub_s.equals(p)){
                findAnagrams.add(i);
            }
            i++;
            j++;

        }
        return findAnagrams;
    }

本地IDE版本:

java 复制代码
public class leetcode438 {
    //时间复杂度O(Nmlogm) ,N是s长度,m是p长度
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> findAnagrams = new ArrayList<>();
        int i = 0;
        int j = i + p.length();
        char [] pChars = p.toCharArray();
        Arrays.sort(pChars);
        p = new String(pChars);
        while(j <= s.length()){
            String sub_s = s.substring(i, j);
            char[] temp = sub_s.toCharArray();
            Arrays.sort(temp);
            sub_s = new String(temp);
            if(sub_s.equals(p)){
                findAnagrams.add(i);
            }
            i++;
            j++;

        }
        return findAnagrams;
    }

    public static void main(String[] args) {
        leetcode438 leetcode438 = new leetcode438();
        String s = "abab";
        String p = "ab";
        System.out.println(leetcode438.findAnagrams(s, p));

    }
}
相关推荐
她说可以呀24 分钟前
Vue插槽
前端·javascript·vue.js
qq_4480111635 分钟前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
zzu123zsw1 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
UIU1142 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
源码集结号2 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场2 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi2 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
啃瓜子的松鼠2 小时前
泛微OAe9-后端二开异步调用
java
FRing033 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
秋天的怀念_David3 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法