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).
注意此题字典中可能存在重复的字符串。不会写,参考:http://www.cnblogs.com/springfor/p/3872516.html
Source
public List<Integer> findSubstring(String S, String[] L) {
List<Integer> a = new ArrayList<Integer>();
if(S.length() == 0 || L.length == 0) return a;
HashMap<String, Integer> hm = new HashMap<String, Integer>();
for(int i = 0; i < L.length; i++){
if(!hm.containsKey(L[i])){
hm.put(L[i], 1);
}
else{
hm.put(L[i], hm.get(L[i]) + 1);
}
}
for(int i = 0; i < L[0].length(); i++){
int cnt = 0;
int index = i;
HashMap<String, Integer> cur = new HashMap<String, Integer>();
for(int j = i; j <= S.length() - L[0].length(); j += L[0].length()){
String temp = S.substring(j, j + L[0].length());
if(!hm.containsKey(temp)){
cur.clear();
cnt = 0;
index = j + L[0].length();
}
else{
if(!cur.containsKey(temp))
cur.put(temp, 1);
else{
cur.put(temp, cur.get(temp) + 1);
}
if(cur.get(temp) <= hm.get(temp))
cnt++;
else{
while(cur.get(temp) > hm.get(temp)){
String b = S.substring(index, index + L[0].length());
cur.put(b, cur.get(b) - 1);
index = index + L[0].length();
if(cur.get(b) < hm.get(b))
cnt--;
}
}
if(cnt == L.length){
a.add(index);
String b = S.substring(index, index + L[0].length());
cur.put(b, cur.get(b) - 1);
index = index + L[0].length();
cnt--;
}
}
}
}
return a;
}