十 438. 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词https://leetcode.cn/problems/find-all-anagrams-in-a-string/给定两个字符串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 * 104s和p仅包含小写字母class Solution { public ListInteger findAnagrams(String s, String p) { //返回结果 ListInteger result new ArrayList(); //s长度p长度直接返回 if(s.length() p.length()){ return result; } MapCharacter, Integer need new HashMap();// need: p的字符频率需求 MapCharacter, Integer window new HashMap();// window: 当前窗口的所需字符频率 int left 0,right 0; int valid 0;// 窗口中满足need条件的字符种类数 // 初始化need for(char c : p.toCharArray()){ need.put(c, need.getOrDefault(c, 0) 1); } while(right s.length()){ // 扩大窗口 char c s.charAt(right); right; if(need.containsKey(c)){ window.put(c, window.getOrDefault(c, 0) 1); if(window.get(c).equals(need.get(c))){ valid; } } // 保持窗口大小 p.length() // 当窗口大小 p.length() 时检查是否匹配 if(right - left p.length()){ // 检查是否所有字符都满足 if(valid need.size()){ result.add(left); } // 收缩左边界为下一次滑动做准备 char d s.charAt(left); left; if(need.containsKey(d)){ if(window.get(d).equals(need.get(d))){ valid--; } window.put(d, window.get(d) - 1); } } } return result; } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453612.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!