首页 > 代码库 > [LeetCode] Substring with Concatenation of All Words
[LeetCode] Substring with Concatenation of All Words
主要思路是:
1. 将words中的每个单词看作一个单元,每个单元长度是c,则s可以切成c个list,每个list是由c个字符组成的单元组。
2. 维护长度为words.size()的滑块,计算每个滑块内是否正好由words中所有单词组成。
3. 将移动滑块的操作优化到O(1) 或 O(logN)
滑块内的内容要不填满words,超出的部分和不是words中的部分放入others中。
1 class Solution { 2 public: 3 vector<int> findSubstring(string s, vector<string>& words) { 4 vector<int> ans; 5 if (s.size() == 0 || words.size() == 0 || words[0].size() == 0) return ans; 6 int wl = words[0].size(); 7 int n = s.size(); 8 int m = words.size(); 9 map<string, int> ms; 10 for (const auto& c : words) { 11 if (ms.find(c) != ms.end()) { 12 ms[c] += 1; 13 } else { 14 ms[c] = 1; 15 } 16 }; 17 18 for (int i = 0; i < wl && i < n; i++) { 19 int count = m; 20 map<string, int> ws = ms; 21 multiset<string> others; 22 for (int j = i; j < n; j += wl) { 23 int r = j - m*wl; 24 //recover 25 if (r >= 0) { 26 string tmp = s.substr(r, wl); 27 if (others.count(tmp)) { 28 others.erase(others.find(tmp)); 29 } else { 30 ws[tmp] ++; 31 count ++; 32 } 33 } 34 //do 35 string tmp = s.substr(j, wl); 36 if (ws.count(tmp) && ws[tmp] > 0) { 37 count --; 38 ws[tmp] --; 39 } else { 40 others.insert(tmp); 41 } 42 if (count == 0 && others.size() == 0) { 43 ans.push_back(j - (m-1)*wl); 44 } 45 } 46 } 47 sort(ans.begin(), ans.end()); 48 return ans; 49 } 50 };
[LeetCode] Substring with Concatenation of All Words
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。