public
class
Solution{
public
static
List<Integer> findSubstring(String S, String[] L){
ArrayList<Integer> startPoints =
new
ArrayList<Integer>();
if
(L.length !=
0
){
if
(S==
null
|| S.length() ==
0
)
return
startPoints;
else
{
int
lengthOfArray = L.length;
int
lengthOfWord = L[
0
].length();
int
lengthOfString = S.length();
if
(lengthOfString < lengthOfArray * lengthOfWord)
return
startPoints;
else
{
Map<String, Integer> dict =
new
HashMap<String, Integer>();
for
(
int
j =
0
; j < lengthOfArray; ++j){
if
(dict.containsKey(L[j])){
int
value = dict.get(L[j]) +
1
;
dict.put(L[j], value);
}
else
dict.put(L[j],
1
);
}
for
(
int
i =
0
; i < lengthOfString - lengthOfWord * lengthOfArray +
1
; ++i){
Map<String, Integer> check =
new
HashMap<String, Integer>();
boolean
canBeStart =
true
;
for
(
int
j =
0
; j < lengthOfArray; ++j){
String inChecked = S.substring(i + j * lengthOfWord, i + (j +
1
)*lengthOfWord);
if
(dict.containsKey(inChecked)){
if
(check.containsKey(inChecked)){
int
mult = check.get(inChecked) +
1
;
if
(mult > dict.get(inChecked)){
canBeStart =
false
;
break
;
}
else
check.put(inChecked, mult);
}
else
check.put(inChecked,
1
);
}
else
{
canBeStart =
false
;
break
;
}
}
if
(canBeStart)
startPoints.add(i);
}
}
}
}
return
startPoints;
}
}