LeetCode 438. Find All Anagrams in a String [Medium]

题目来源: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 恢复成最初的数值。这样就相当于从一个新的位置重新开始。