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).
[code]
public class Solution {
public List<Integer> findSubstring(String s, String[] L) {
list=new ArrayList<Integer>();
if(s==null || s.length()==0 || L==null || L.length==0)return list;
HashMap<String, Integer> map=new HashMap<String, Integer>();
for(String ss: L)
{
if(map.containsKey(ss))map.put(ss, map.get(ss)+1);
else map.put(ss, 1);
}
len=L.length*L[0].length();
n=L[0].length();
int index=0;
while(index+len<=s.length())
{
HashMap<String, Integer> temp=new HashMap<String, Integer>(map);
int i=0;
while(map.size()>0)
{
String e=s.substring(index+i*n,index+(i+1)*n);
if(map.containsKey(e))
{
if(map.get(e)==1)map.remove(e);
else map.put(e, map.get(e)-1);
}
else break;
i++;
}
if(map.size()==0)list.add(index);
map=temp;
index++;
}
return list;
}
List<Integer> list;
int len;
int n;
}
[Thought]
一开始忽略了duplicate得情况,用的HashSet. 而且递归版本会stackoverflow