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 43 44 45 46 47 48 49 50 51 52 53 54 55
| class Solution { public List<Integer> findSubstring(String s, String[] words) { List<Integer> result = new ArrayList<>(); if (s == null || s.length() == 0 || words == null || words.length == 0) return result;
int wordLen = words[0].length(); int wordCount = words.length; int totalLen = wordLen * wordCount;
Map<String, Integer> wordMap = new HashMap<>(); for (String word : words) { wordMap.put(word, wordMap.getOrDefault(word, 0) + 1); }
for (int i = 0; i < wordLen; i++) { int left = i, right = i; Map<String, Integer> seen = new HashMap<>(); int count = 0;
while (right + wordLen <= s.length()) { String word = s.substring(right, right + wordLen); right += wordLen;
if (wordMap.containsKey(word)) { seen.put(word, seen.getOrDefault(word, 0) + 1); count++;
while (seen.get(word) > wordMap.get(word)) { String leftWord = s.substring(left, left + wordLen); seen.put(leftWord, seen.get(leftWord) - 1); left += wordLen; count--; }
if (count == wordCount) { result.add(left); }
} else { seen.clear(); count = 0; left = right; } }
}
return result; } }
|