Description
You are given a string s and an array of strings words of the same length. Return all starting indices of substring(s) in s that is a concatenation of each word in words exactly once, in any order, and without any intervening characters.
You can return the answer in any order.
Example 1:
Input: s = “barfoothefoobarman”, words = [“foo”,”bar”]
Output: [0,9]
Explanation: Substrings starting at index 0 and 9 are “barfoo” and “foobar” respectively.
The output order does not matter, returning [9,0] is fine too.
Example 2:
Input: s = “wordgoodgoodgoodbestword”, words = [“word”,”good”,”best”,”word”]
Output: []
Example 3:
Input: s = “barfoofoobarthefoobarman”, words = [“bar”,”foo”,”the”]
Output: [6,9,12]
Constraints:
1 <= s.length <= 104
s consists of lower-case English letters.
1 <= words.length <= 5000
1 <= words[i].length <= 30
words[i] consists of lower-case English letters.
Solutions
Solved with a sliding window and two HashMaps.
- We store all the words in the HashMap, the key directly stores the word, and the value stores the number of occurrences of the word (because the given word may be repeated, so it may be 1 or 2 or other).
- Scan the words of the substring, if the word currently scanned is in the previous HashMap, store the word in the new HashMap
- The substring scan ends, if all the words of the substring match, then the substring is one of the ones we are looking for
1 | class Solution: |
use libraray collections.Counter
1 | class Solution: |
Note
1 | >>> from collections import Counter |