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

    }
}
相关推荐
罗西的思考5 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
kyriewen6 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
free357 小时前
从 0 实现一个 Tiny JavaScript VM:项目架构拆解
javascript
美团技术团队8 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
徐小夕8 小时前
我们开源了一款“框架无关”的思维导图编辑器,3分钟集成到任意系统
前端·javascript·github
PBitW8 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
像我这样帅的人丶你还9 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩9 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
labixiong9 小时前
还原一个完整符合规范的 Promise(二)
前端·javascript
tntxia10 小时前
Mybatis的日志输入
java