1 public class Solution { 2 public ArrayList<Integer> findSubstring(String S, String[] L) { 3 // IMPORTANT: Please reset any member data you declared, as 4 // the same Solution instance will be reused for each test case. 5 ArrayList<Integer> results = new ArrayList<Integer>(); 6 int len = L.length; 7 if (S.length() == 0||len == 0) { 8 results.add(0); 9 return results; 10 } 11 12 int M = S.length(); 13 int N = L[0].length(); 14 Map<String, Integer> expected = new HashMap<String, Integer>(); 15 Map<String, Integer> real = new HashMap<String, Integer>(); 16 for (int j = 0; j < len; j++) { 17 if (expected.get(L[j]) == null) { 18 expected.put(L[j], 1); 19 real.put(L[j], 0); 20 } else { 21 expected.put(L[j], expected.get(L[j]) + 1); 22 } 23 } 24 25 for (int i = 0; i <= (M - N * len); i++) { 26 int j = 0; 27 for (; j < len;) { 28 String tmp = S.substring(i + j * N, i + (j + 1) * N); 29 if (expected.get(tmp) == null) { 30 break; 31 } else { 32 real.put(tmp, real.get(tmp) + 1); 33 if (real.get(tmp) > expected.get(tmp)) { 34 break; 35 } 36 j = j + 1; 37 } 38 } 39 40 if (j == len) { 41 results.add(i); 42 } 43 for (int m = 0; m < len; m++) { 44 real.put(L[m], 0); 45 } 46 47 } 48 return results; 49 } 50 }