LeetCode - Find All Anagrams in a String
Posted IncredibleThings
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode - Find All Anagrams in a String相关的知识,希望对你有一定的参考价值。
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".
这道题先想到了用hash存一下p出现的字符和个数,然后遍历s来做。但超时了:
class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> resList = new ArrayList<>(); if(s == null || p == null){ return resList; } Map<Character, Integer> map =new HashMap<>(); for(char c : p.toCharArray()){ map.put(c, map.getOrDefault(c,0)+1); } for(int i = 0; i <= s.length()-p.length(); i++){ Map<Character, Integer> temp =new HashMap<>(map); for(int j = i; j < i + p.length(); j++){ char c = s.charAt(j); if(temp.containsKey(c)){ int v = temp.get(c) - 1; if(v < 0){ break; } temp.put(c,v); } else{break;} } boolean match = true; for(char c : temp.keySet()){ if(temp.get(c) != 0){ match = false; break; } } if(match){ resList.add(i); } } return resList; } }
以上是关于LeetCode - Find All Anagrams in a String的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode - Find All Anagrams in a String
Leetcode 438. Find All Anagrams in s String
[leetcode-438-Find All Anagrams in a String]
LeetCode 448. Find All Numbers Disappeared in an Array & 442. Find All Duplicates in an Array(示例