解题思路:
首先创建一个根据words字符串数组创建一个词袋,然后基础指针pstart一位一位向后移,判别指针p1,p2在基础指针的基础上后移,如果找到words数组中的单词,词袋对应的词数减一操作;如果以pstart为基础的对应字符串不不和条件,就再次创建词袋,然后再判断。这个方法比较耗时。
提交代码:
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> sublist = new ArrayList<>();
if (s == "" || s == null)
return sublist;
int len, cnt = 0, wordcnt = words.length;
Map<String, Integer> map ;
if (words.length == 0)
return sublist;
else
len = words[0].length();
String cur;
// create map
map=initMap(words);
int pstart = 0, p1 = pstart, p2 = p1 + len;
while (p2 <= s.length()) {
while (p2 <= s.length()) {
cur = s.substring(p1, p2);
if (map.containsKey(cur)) {
if (map.get(cur) > 0) {
map.put(cur, map.get(cur) - 1);
cnt++;
if(cnt==wordcnt) {
sublist.add(pstart);
map = initMap(words);
break;
}
}
else {
map = initMap(words);
break;
}
p1 += len;
p2 = p1 + len;
} else {
map = initMap(words);
break;
}
} // while(1)
pstart++;p1 = pstart;p2 = p1 + len;
cnt=0;
} // while2
return sublist;
}
public Map<String, Integer> initMap(String[] words) {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < words.length; i++) {
if (map.containsKey(words[i]))
map.put(words[i], map.get(words[i]) + 1);
else
map.put(words[i], 1);
}
return map;
}
}
运行结果: