题目来源:https://leetcode.com/problems/find-all-anagrams-in-a-string/
题目难度:Medium
解法1[Java]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import java.util.ArrayList; import java.util.List;
class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> res = new ArrayList<>(); if (s == null || p == null || p.length() > s.length()) { return res; }
int[] map = new int[128]; for (char ch : p.toCharArray()) { map[ch]++; }
int left = 0, right = 0; int len_s = s.length(); int len_p = p.length(); while (right < len_s) { char ch_r = s.charAt(right); map[ch_r]--; while (map[ch_r] < 0) { char ch_l = s.charAt(left++); map[ch_l]++; } if (right - left + 1 == len_p) { res.add(left); } right++; } return res; } }
|
思路
先设计了一个 map,把 p 中所有的字符在 map 中的值先加1。
然后设计两个指针,右指针指向哪个字符,就把这个字符在 map 中对应的值减去 1。如果指向的字符不在 p 中,会导致那个字符对应的值小于0,根据这个条件,把左指针一步一步移到和右指针相同的位置,并且在移动的过程中把 map 恢复成最初的数值。这样就相当于从一个新的位置重新开始。