LeetCode第438题 - 找到字符串中所有字母异位词
题目
解答
class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> results = new ArrayList<>();Map<Character, Integer> needs = new HashMap<>();for (char c : p.toCharArray()) {needs.put(c, needs.getOrDefault(c, 0) + 1);}Map<Character, Integer> window = new HashMap<>();int left = 0;int right = 0;while (right < s.length()) {char c1 = s.charAt(right);++right;if (needs.containsKey(c1)) {window.put(c1, window.getOrDefault(c1, 0) + 1);}while (left < right && isValid(needs, window)) {if (right - left == p.length()) {results.add(left);}char c2 = s.charAt(left);++left;if (needs.containsKey(c2)) {window.put(c2, window.getOrDefault(c2, 0) - 1);}}}return results;}public boolean isValid(Map<Character, Integer> needs, Map<Character, Integer> window) {for (Map.Entry<Character, Integer> entry : needs.entrySet()) {if (!window.containsKey(entry.getKey())) {return false;}int value = window.get(entry.getKey());if (value < entry.getValue()) {return false;}}return true;}
}
总结
异位词可以理解为相同字母的排列。那么排列怎么理解呢?即相同的字母,相同的长度,因而并不需要把所有的排列都计算得到。