1
1
func findAnagrams (s string , p string ) []int {
2
- startIndex := 0
3
- pMap := make (map [byte ]int )
4
- sMap := make (map [byte ]int )
5
- var res []int
6
-
7
- for i := 0 ; i < len (p ); i ++ {
8
- pMap [p [i ]] = 1 + pMap [p [i ]]
9
- }
10
-
11
- for i := 0 ; i < len (s ); i ++ {
12
- sMap [s [i ]] = 1 + sMap [s [i ]]
13
-
14
- if i >= len (p ) - 1 {
15
- if equals (sMap , pMap ) {
16
- res = append (res , startIndex )
17
- }
18
-
19
- if _ , ok := sMap [s [startIndex ]]; ok {
20
- sMap [s [startIndex ]] = sMap [s [startIndex ]] - 1
21
- if sMap [s [startIndex ]] == 0 {
22
- delete (sMap , s [startIndex ])
23
- }
24
- }
25
- startIndex += 1
26
- }
27
- }
28
- return res
29
- }
2
+ len_s , len_p := len (s ), len (p )
3
+ if len_p > len_s {
4
+ return []int {}
5
+ }
6
+
7
+ ans := make ([]int , 0 , len_s )
8
+ count_p , count_s := count (p ), count (s [:len_p ])
9
+
10
+ if count_p == count_s {
11
+ ans = append (ans , 0 )
12
+ }
30
13
31
- func equals (a , b map [byte ]int ) bool {
32
- for k , v := range a {
33
- if b [k ] != v {
34
- return false
35
- }
36
- }
37
- return true
14
+ for i := len_p ; i < len_s ; i ++ {
15
+ count_s [int (s [i - len_p ]- 'a' )]--
16
+ count_s [int (s [i ]- 'a' )]++
17
+ if count_p == count_s {
18
+ ans = append (ans , i - len_p + 1 )
19
+ }
20
+ }
21
+
22
+ return ans
38
23
}
24
+
25
+ func count (s string ) [26 ]int {
26
+ arr := [26 ]int {}
27
+ for _ , r := range []rune (s ) {
28
+ arr [int (r - 'a' )]++
29
+ }
30
+ return arr
31
+ }
0 commit comments