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 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
江畔柳前堤4 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
hey_sml4 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo4 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore5 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
萧瑟余晖5 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才6 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio6 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考7 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX7 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm