题目描述
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]
解题思路
【C++】
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
int len = s.size(), m = words.size(), n = words[0].size(), wLen = m * n;
if (len == 0 || m == 0 || len < wLen) {return res;}
unordered_map<string, int> mp;
for (int i=0; i<m; i++) {++mp[words[i]];}
for (int i=0; i+wLen<=len; i++) {
int j = i;
unordered_map<string, int> tmp;
for (; j < i + wLen; j += n) {
string str = s.substr(j, n);
if (mp.find(str) == mp.end()) {break;}
++tmp[str];
if (mp[str] < tmp[str]) {break;}
}
if (j == i + wLen) {
res.push_back(i);
}
}
return res;
}
};
【Java】
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> res = new LinkedList<>();
int len = s.length(), m = words.length, n = words[0].length();
int wLen = m * n;
if (len ==0 || m == 0 || len < wLen) {return res;}
Map<String, Integer> dict = new HashMap<>();
for (String word : words) {dict.put(word, dict.getOrDefault(word, 0) + 1);}
for (int i=0; i<=len-wLen; i++) {
int j = i;
Map<String, Integer> tmp = new HashMap<>();
for (; j < i + wLen; j += n) {
String str = s.substring(j, j + n);
if (!dict.containsKey(str)) {break;}
tmp.put(str, tmp.getOrDefault(str, 0) + 1);
if (dict.get(str) < tmp.get(str)) {break;}
}
if (j == i + wLen) {
res.add(i);
}
}
return res;
}
}
参考文献