Given a string s and a non-empty string p, find all the start indices of p‘s anagrams in s. Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100. The order of output does not matter. Example 1: Input: s: "cbaebabacd" p: "abc" Output: [0, 6] Explanation: The substring with start index = 0 is "cba", which is an anagram of "abc". The substring with start index = 6 is "bac", which is an anagram of "abc". Example 2: Input: s: "abab" p: "ab" Output: [0, 1, 2] Explanation: The substring with start index = 0 is "ab", which is an anagram of "ab". The substring with start index = 1 is "ba", which is an anagram of "ab". The substring with start index = 2 is "ab", which is an anagram of "ab".
Time Complexity will be O(n) because the "start" and "end" points will only move from left to right once.
Sliding Window: Use a count to denote the difference between current sliding window and p, if count == 0, means the current sliding window is the same with p, add start to the result
1 public class Solution { 2 public List<Integer> findAnagrams(String s, String p) { 3 List<Integer> res = new ArrayList<Integer>(); 4 if (s==null || s.length()==0 || p==null || p.length()==0 || p.length()>s.length()) return res; 5 int[] chars = new int[26]; 6 for (int i=0; i<p.length(); i++) { 7 chars[p.charAt(i)-‘a‘]++; 8 } 9 int start = 0, end = 0, count = p.length(); 10 while (end < s.length()) { 11 if (end-start==p.length() && chars[s.charAt(start++)-‘a‘]++>=0) count++; 12 if (--chars[s.charAt(end++)-‘a‘] >= 0) count--; 13 if (count == 0) res.add(start); 14 } 15 return res; 16 } 17 }
时间: 2024-10-10 03:20:51