You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
For example, given:
s: "barfoothefoobarman"
words: ["foo", "bar"]
You should return the indices: [0,9]
.
(order does not matter).
public ArrayList<Integer> findSubstring(String S, String[] L) {
ArrayList<Integer> res = new ArrayList<Integer>();
int m = L.length;
if(m==0) return res;
int n = L[0].length();
if(n==0 || S.length()<m*n) return res;
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(int i=0; i<m; i++){// store all words into map, mapped value is the count of the word
if(map.containsKey(L[i])) map.put(L[i], map.get(L[i])+1);
else map.put(L[i], 1);
}
for(int i=0; i<=S.length()-m*n; i++){
HashMap<String, Integer> temp = new HashMap<String, Integer>(map);
for(int j=0; j<m; j++){
String str = S.substring(i+j*n, i+(j+1)*n); // get the word in S
if(temp.containsKey(str)){// if the word appear in L
if(temp.get(str)-1>0) temp.put(str,temp.get(str)-1);
else temp.remove(str);
}
else break;
}
if(temp.isEmpty()){res.add(i);}
else temp.clear();
}
return res;
}