public class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> result = new ArrayList<Integer>();
if (s == null || s.length() == 0 || words.length == 0) {
return result;
}
Map<String, Integer> freq = new HashMap<String, Integer>();
for (String word : words) {
if (freq.containsKey(word)) {
freq.put(word, freq.get(word) + 1);
} else {
freq.put(word, 1);
}
}
int wordLen = words[0].length();
for (int i = 0; i < wordLen; i++) {
Map<String, Integer> map = new HashMap<String, Integer>();
int left = i;
int wordNum = 0;
for (int j = i; j <= s.length() - wordLen; j += wordLen) {
String sub = s.substring(j, j + wordLen);
if (freq.containsKey(sub)) {
if (map.containsKey(sub)) {
map.put(sub, map.get(sub) + 1);
} else {
map.put(sub, 1);
}
wordNum++;
while (map.get(sub) > freq.get(sub)) {
String temp = s.substring(left, left + wordLen);
map.put(temp, map.get(temp) - 1);
wordNum--;
left = left + wordLen;
}
if (wordNum == words.length) {
result.add(left);
String temp = s.substring(left, left + wordLen);
map.put(temp, map.get(temp) - 1);
wordNum--;
left = left + wordLen;
}
} else {
map.clear();
left = j + wordLen;
wordNum = 0;
}
}
}
return result;
}
}