-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathp438.rs
42 lines (37 loc) · 989 Bytes
/
p438.rs
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
34
35
36
37
38
39
40
41
42
#[test]
fn test() {
assert_eq!(
find_anagrams("cbaebabacd".to_string(), "abc".to_string()),
vec![0, 6]
);
assert_eq!(
find_anagrams("abab".to_string(), "ab".to_string()),
vec![0, 1, 2]
);
}
pub fn find_anagrams(s: String, p: String) -> Vec<i32> {
let m: usize = s.len();
let n: usize = p.len();
if n > m {
return vec![];
}
// 准备p的哈希表
let mut map_p: [i32; 26] = [0; 26];
for c in p.chars() {
map_p[c as usize - 'a' as usize] += 1;
}
let mut ans: Vec<i32> = vec![];
let s: Vec<char> = s.chars().collect();
// 维护一个大小是n的窗口,[start, end]
for start in 0..(m - n + 1) {
// 准备子串的哈希表
let mut map_s: [i32; 26] = [0; 26];
for end in start..(start + n) {
map_s[s[end] as usize - 'a' as usize] += 1;
}
if map_p == map_s {
ans.push(start as i32);
}
}
ans
}