30 Substring with Concatenation of All Words
1. Question
You are given a string,s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
For example, given:
s:"barfoothefoobarman"
words:["foo", "bar"]
You should return the indices:[0,9]
.
(order does not matter).
2. Implementation
(1) Two Pointers + Hash
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
int n = words.length, wordLen = words[0].length();
List<Integer> res = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
Map<String, Integer> seen = new HashMap<>();
for (String word : words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
for (int i = 0; i <= s.length() - wordLen * n; i++) {
seen = new HashMap<>();
int j = 0;
for (; j < n; j++) {
String word = s.substring(i + j * wordLen, i + (j + 1) * wordLen);
if (!map.containsKey(word)) {
break;
}
seen.put(word, seen.getOrDefault(word, 0) + 1);
if (seen.get(word) > map.get(word)) {
break;
}
}
if (j == n) {
res.add(i);
}
}
return res;
}
}
3. Time & Space Complexity
Two Pointers: 时间复杂度O(mn), m为s的长度,n为words里word的个数,空间复杂度O(n)
Last updated
Was this helpful?