You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.
For example, given:
S: "barfoothefoobarman"
L: ["foo", "bar"]
You should return the indices: [0,9]
.
(order does not matter).
import java.util.*;
public class Solution {
public List<Integer> findSubstring(String S, String[] L) {
HashMap<String, Integer> map=new HashMap<String, Integer> ();
List<Integer> result=new ArrayList<Integer>();
if(S==null||S.length()==0||L==null||L.length==0) return result;
int w=L[0].length();
for(int i=0;i<L.length;i++){map.put(L[i],map.containsKey(L[i])? map.get(L[i])+1:1);}
for(int i=0;i<=S.length()-L.length*w;i++){
HashMap<String,Integer> tempmap=new HashMap<String, Integer>(map);
for(int j=0;j<L.length;j++){
String word=S.substring(i+j*w,i+j*w+w);
if(tempmap.containsKey(word)){
int num=tempmap.get(word);
num=num-1;
if(num>0){
tempmap.put(word,num);
}else{
tempmap.remove(word);
}
}else{
break;
}
}
if(tempmap.isEmpty()){
result.add(i);
}
}
return result;
}
}