11class Solution {
22 public List <Integer > findSubstring (String s , String [] words ) {
3- int n = words .length ;
4- HashMap < String , Integer > map = new HashMap <>() ;
5- List < Integer > result = new ArrayList <> ();
3+ int n = s .length () ;
4+ int num = words . length ;
5+ int length = words [ 0 ]. length ();
66
7- for (int i = 0 ; i < n ; i ++) {
8- map .put (words [i ],map .getOrDefault (words [i ], 0 ) + 1 );
9- }
7+ Map <String , Integer > counts = new HashMap <>();
108
11- int k = words [0 ].length () * words .length ;
12- int z = words [0 ].length ();
13- int i = 0 , j = 0 ;
9+ for (String word : words ) counts .put (word , counts .getOrDefault (word , 0 ) + 1 );
1410
15- while (j < s .length ()) {
16- if (j - i + 1 == k ) {
17-
18- String sub = s .substring (i , j + 1 );
19- HashMap <String , Integer > map2 = new HashMap <>();
20- int p = 0 ;
11+ List <Integer > indexes = new ArrayList <>();
12+
13+ for (int k = 0 ; k < length ; k ++) {
14+ int left = k ;
15+ int right = k ;
16+ int count = 0 ;
17+
18+ Map <String , Integer > seen = new HashMap <>();
19+
20+ while (right + length <= n ) {
21+ String word = s .substring (right , right + length );
22+ right += length ;
2123
22- while (p < sub .length ()) {
23- String temp = sub .substring (p , p + z );
24- map2 .put (temp ,map2 .getOrDefault (temp , 0 ) + 1 );
25- p += z ;
26- }
24+ if (counts .containsKey (word )) {
25+ seen .put (word , seen .getOrDefault (word , 0 ) + 1 );
26+ count ++;
2727
28- if (map .equals (map2 )){
29- result .add (i );
28+ while (seen .get (word ) > counts .get (word )) {
29+ String leftWord = s .substring (left , left + length );
30+ seen .put (leftWord , seen .get (leftWord ) - 1 );
31+ left += length ;
32+ count --;
33+ } if (count == num ) indexes .add (left );
34+ } else {
35+ seen .clear ();
36+ count = 0 ;
37+ left = right ;
3038 }
31- i ++;
3239 }
33- j ++;
3440 }
35- return result ;
41+ return indexes ;
3642 }
3743}
0 commit comments