第一种就是暴力求解,遍历所有可能的长度为 n * w 的子串(n是单词个数,w为每个单词的长度),使用hashmap来记录里面每个单词出现的次数,如果和words数组里的单词及出现次数刚好相同,则为一个解,否则继续遍历。这样的话时间复杂度为 o((l - n * w) * (n * w)),共计l - n * w个起始位置,每次遍历长度为 n * w。
classSolution{ public List<Integer> findSubstring(String s, String[] words){ List<Integer> res = new ArrayList<>(); if (words.length == 0) { return res; }
int w = words[0].length(), n = words.length, l = s.length(), count = 0; Map<String, Integer> total = new HashMap<>(), wd = new HashMap(); for (String word : words) { total.put(word, total.getOrDefault(word, 0) + 1); }
// 共计w中开始位置 for (int i = 0; i < w; i++) { wd.clear(); count = 0; // 每次开始进行遍历,步长为w for (int j = i; j + w <= l; j += w) { // 注意这里有等于,例如单词长度为5,一个单词的情况,我们第一个单词位置是[0, 4],大小为5的时候已经是下一个单词了,因此是j >= if (j >= i + n * w) { // 此时,从wd里去掉第一个单词 String temp = s.substring(j - n * w, j - (n - 1) * w); wd.put(temp, wd.get(temp) - 1); if (wd.get(temp) < total.getOrDefault(temp, 0)) { count--; } }