For example, given:
S:
"barfoothefoobarman"L:
["foo", "bar"]
You should return the indices:
[0,9].(order does not matter).
Brute Force, enumerate each substring and check the word in the substring to see if it satisfy the constriction. I first build a hashmap on the L to record the count for each word, and while checking the substring, we also build such a hashmap, whenever we find a word that is not in the L, we terminate the checking and go to next one, or we find a word that appears more than those in L. Otherwise we have find a valid substring and we add the index to the result set.
public List<Integer> findSubstring(String S, String[] L) {
List<Integer> res = new ArrayList<Integer>();
int n = L.length;
if(n == 0)
return res;
int m = L[0].length();
int len = S.length();
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(int i = 0; i < n; i++) {
if(map.containsKey(L[i]) == false)
map.put(L[i], 1);
else
map.put(L[i], map.get(L[i]) + 1);
}
HashMap<String, Integer> count = new HashMap<String, Integer>();
for(int i = 0; i <= len - n*m; i++) {
count.clear();
int j = i;
for(j = i; j < i + n*m; j += m) {
String str = S.substring(j, j+m);
if(map.containsKey(str) == false)
break;
else {
if(count.containsKey(str) == false)
count.put(str, 1);
else {
if(count.get(str) >= map.get(str))
break;
else
count.put(str, count.get(str) + 1);
}
}
}
if(j == i + n*m)
res.add(i);
}
return res;
}
没有评论:
发表评论