思路:滑动窗口,哈希表
- 为词典中的单词建立一个哈希表。
- 词典中单词的长度为
len
,单词个数为n
,滑动窗口长度为len * n
- 分别以字符串前
len
个单词为滑动窗口的起始点,每次向后滑动len
个字符,为滑动窗口中的字符串建立哈希表,若两个哈希表相等,说明找到了一个目标子串。
代码:
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> res = new ArrayList<>();
if (s == null || s.length() == 0 || words == null || words.length == 0) {
return res;
}
int miniLen = words[0].length();
int len = miniLen * words.length;
Map<String, Integer> map = new HashMap<>();
for (String word : words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
for (int i = 0; i < miniLen; i++) {
int first = i;
int last = first + len;
while (last <= s.length()) {
String subS = s.substring(first, last);
Map<String, Integer> mapTemp = new HashMap<>();
int j = 0;
while (j < subS.length()) {
mapTemp.put(subS.substring(j, j+miniLen), mapTemp.getOrDefault(subS.substring(j, j+miniLen), 0) + 1);
j += miniLen;
}
if (map.equals(mapTemp)) {
res.add(first);
}
first += miniLen;
last += miniLen;
}
}
return res;
}
}