[LeetCode] Substring with Concatenation of All Words

简介: I think the following code is self-explanatory enough. We use an unordered_map counts to record the expected times of each word and another unordered_map seento record the times we have seen.

I think the following code is self-explanatory enough. We use an unordered_map<string, int> counts to record the expected times of each word and another unordered_map<string, int> seento record the times we have seen. Then we check for every possible position of i. Once we meet an unexpected word or the times of some word is larger than its expected times, we stop the check. If we finish the check successfully, push i to the result indexes.

 1 class Solution {
 2 public:
 3     vector<int> findSubstring(string s, vector<string>& words) {
 4         unordered_map<string, int> counts;
 5         for (string word : words)
 6             counts[word]++;
 7         int n = s.length(), num = words.size(), len = words[0].length();
 8         vector<int> indexes;
 9         for (int i = 0; i < n - num * len + 1; i++) {
10             unordered_map<string, int> seen;
11             int j = 0;
12             for (; j < num; j++) {
13                 string word = s.substr(i + j * len, len);
14                 if (counts.find(word) != counts.end()) {
15                     seen[word]++;
16                     if (seen[word] > counts[word])
17                         break;
18                 } 
19                 else break;
20             }
21             if (j == num) indexes.push_back(i);
22         }
23         return indexes;
24     }
25 };

The following is a more sophisticated solution taken from this link. You may need to spend some time understanding how it works.

 1 class Solution {
 2 public:
 3     vector<int> findSubstring(string s, vector<string>& words) {
 4         int n = s.length(), len = words[0].length(), num = words.size();
 5         unordered_map<string, int> counts;
 6         for (string word : words)
 7             counts[word]++;
 8         vector<int> indexes;
 9         for (int i = 0; i < len; i++) {
10             int left = i, valid = 0;
11             unordered_map<string, int> seen;
12             for (int j = i; j <= n - len; j += len) {
13                 string word = s.substr(j, len);
14                 if (counts.find(word) != counts.end()) {
15                     seen[word]++;
16                     if (seen[word] <= counts[word])
17                         valid++;
18                     else {
19                         while (seen[word] > counts[word]) {
20                             string wd = s.substr(left, len);
21                             seen[wd]--;
22                             if (seen[wd] < counts[wd]) valid--;
23                             left += len;
24                         }
25                     }
26                     if (valid == num) {
27                         indexes.push_back(left);
28                         seen[s.substr(left, len)]--;
29                         valid--;
30                         left += len;
31                     }
32                 }
33                 else {
34                     seen.clear();
35                     valid = 0;
36                     left = j + len;
37                 }
38             }
39         }
40         return indexes;
41     }
42 };

 

目录
相关文章
LeetCode contest 187 1437. 是否所有 1 都至少相隔 k 个元素 Check If All 1's Are at Least Length K Places Away
LeetCode contest 187 1437. 是否所有 1 都至少相隔 k 个元素 Check If All 1's Are at Least Length K Places Away
|
算法
LeetCode - 30. Substring with Concatenation of All Words
30. Substring with Concatenation of All Words  Problem's Link  ---------------------------------------------------------------------------...
1140 0
|
iOS开发
LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博.
4447 0
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
33076 80
如何保证分布式文件系统的数据一致性

热门文章

最新文章