用java解答。给定一个字符串 str 和一个字符串数组 words。 words 中所有字符串长度相同。 str 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。 请找到所有串联字符串在 str 中的开始索引,最终结果以int数组形式,索引按照从小大到的顺序返回。
时间: 2023-07-07 09:45:30 浏览: 170
好的,以下是Java代码实现:
```java
public static List<Integer> findSubstring(String str, String[] words) {
List<Integer> res = new ArrayList<>();
if (str == null || str.length() == 0 || words == null || words.length == 0) {
return res;
}
int n = str.length(), m = words.length, k = words[0].length();
Map<String, Integer> map = new HashMap<>();
for (String word : words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
for (int i = 0; i < k; i++) {
int left = i, right = i, count = 0;
Map<String, Integer> tmpMap = new HashMap<>();
while (right + k <= n) {
String word = str.substring(right, right + k);
right += k;
if (!map.containsKey(word)) {
tmpMap.clear();
count = 0;
left = right;
} else {
tmpMap.put(word, tmpMap.getOrDefault(word, 0) + 1);
count++;
while (tmpMap.get(word) > map.get(word)) {
String leftWord = str.substring(left, left + k);
tmpMap.put(leftWord, tmpMap.get(leftWord) - 1);
count--;
left += k;
}
if (count == m) {
res.add(left);
String leftWord = str.substring(left, left + k);
tmpMap.put(leftWord, tmpMap.get(leftWord) - 1);
count--;
left += k;
}
}
}
}
return res;
}
```
时间复杂度为 O(N*L*M),其中 N 是字符串 str 的长度,L 是单词的长度,M 是单词的个数。空间复杂度为 O(M)。
阅读全文