438. Find All Anagrams in a String (find all the start indices of p's anagrams in s.)
438. Find All Anagrams in a String https://www.youtube.com/watch?v=86fQQ7rVGxA&t=284s class Solution { public List<Integer> findAnagrams(String s, String p) { HashMap<Character, Integer> map = constructMap(p); int slow = 0; List<Integer> list = new ArrayList<>(); int matchCount = 0; for(int fast = 0; fast < s.length(); fast++){ // you have fast++, dont use while then char current = s.charAt(fast); if(map.containsKey(current)){ int count = map.get(current); map.put(current, count - 1); if(count == 1) matchCount++; } if(matchCount == map.size()){ list.add(slow); } if(fast - slow == p.length() - 1){ char c = s.charAt(slow++);////// slow++, dont forget it if(map.containsKey(c)){ /// also used "current" before in this code block, dont use the same var name Integer count = map.get(c); map.put(c, count + 1); if(count == 0) matchCount--; } } } return list; } private HashMap<Character, Integer> constructMap(String p){ HashMap<Character, Integer> map = new HashMap<>(); for(char c : p.toCharArray()){ Integer count = map.get(c); if (count == null){ map.put(c, 1); }else{ map.put(c, count + 1); } } return map; // return map, dont forget } }
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".
posted on 2018-08-09 17:29 猪猪🐷 阅读(125) 评论(0) 收藏 举报
浙公网安备 33010602011771号