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

标签:滑动窗口 双指针

给定两个字符串 sp,找到 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
  • sp 仅包含小写字母

思路:典型滑动窗口题目,滑动窗口关键在于窗口左右指针。直接设置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));

    }
}
相关推荐
叶落阁主3 分钟前
Spring Boot 4 实战:Jackson 2.x 升级到 3.x 踩坑全记录
java·后端·架构
布吉岛的石头3 分钟前
Java 中高级面试:JVM 内存模型 + GC 算法高频题总结
java·jvm·面试
桔筐13 分钟前
Vue3 v-model 双向绑定导致循环触发的坑
前端·javascript·vue.js
2301_7926748623 分钟前
java学习(day32)
java
沉默-_-26 分钟前
备战蓝桥杯-哈希
c++·学习·算法·蓝桥杯·哈希算法
摇滚侠27 分钟前
Oracle19c 导出 Oracle11g 导入,Oracle19c 导出导入,Oracle11g 导出导入
java·数据库·oracle
拼好饭和她皆失31 分钟前
基础算法--写给算法小白的模板指南:快速掌握核心代码,蓝桥杯必备模板
算法
吞下星星的少年·-·31 分钟前
rotate函数应用模板
算法
路光.33 分钟前
ReferenceError:Can‘t find variable:structureClone
前端·javascript·html·vue2
Stella Blog34 分钟前
狂神Java基础学习笔记Day05
java·笔记·学习