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));

    }
}
相关推荐
样例过了就是过了2 分钟前
LeetCode热题100 环形链表 II
数据结构·算法·leetcode·链表
码农幻想梦3 分钟前
3472. 八皇后(北京大学考研机试题目)
考研·算法·深度优先
得物技术4 分钟前
Sentinel Java客户端限流原理解析|得物技术
java·后端·架构
PM老周6 分钟前
2026年软硬件一体化项目管理软件怎么选?多款工具对比测评
java·安全·硬件工程·团队开发·个人开发
匠心网络科技21 分钟前
JavaScript进阶-ES6 带来的高效编程新体验
开发语言·前端·javascript·学习·面试
一只大袋鼠37 分钟前
并发编程(三):线程快照统计・grep+awk+sort+uniq 实战详解
java·开发语言·多线程·并发编程
unfeeling_41 分钟前
Tomcat实验
java·tomcat
Hx_Ma161 小时前
前台模块以及分页逻辑
java·开发语言
岛雨QA1 小时前
递归「Java数据结构与算法学习笔记5」
数据结构·算法
亓才孓1 小时前
AspectJ和SpringAOP的区别
java·开发语言