给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入: s = "barfoothefoobarman", words = ["foo","bar"] 输出:[0,9] 解释: 从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。 输出的顺序不重要, [9,0] 也是有效答案。示例 2:
输入: s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"] 输出:[]C++ 实现过程如下:
class Solution { public: vector<int> findSubstring(string s, vector<string>& words) { if (words.size() == 0) return vector<int>(); if (words[0].size() == 0) return vector<int>(); int wSize = words[0].size(); int wCount = words.size(); if (s.size() < wSize * wCount) return vector<int>(); map<string, int> cMap; map<string, int> cMap_bak; map<string, int>::iterator iter; for (int nIdx = 0; nIdx < wCount; nIdx++) { iter = cMap.find(words[nIdx]); if (iter != cMap.end()) iter->second++; else cMap.insert(pair<string, int>(words[nIdx], 1)); } cMap_bak = cMap; vector<int> cRes; for (int nIdx = 0; nIdx <= s.size() - wCount*wSize; nIdx++) { bool bFind = true; for (int i = 0; i < wCount; i++) { string cstr = s.substr(nIdx + i * wSize,wSize); iter = cMap.find(cstr); if (iter == cMap.end() || iter->second <= 0) { bFind = false; break; } iter->second--; } if (bFind) cRes.push_back(nIdx); cMap = cMap_bak; } return cRes; } }; 执行结果: 通过 显示详情 执行用时 :528 ms, 在所有 cpp 提交中击败了41.04% 的用户 内存消耗 :100.2 MB, 在所有 cpp 提交中击败了20.37%的用户