中级农民
- 积分
- 138
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-9-7
- 最后登录
- 1970-1-1
|
2.minimum substring window. 这个题和求longest substr with at most k distinct chars类似。我用two pointers i, j 指向substring的头尾,让j向前进,同时保持substring字符频率统计,直到当所有要求字符都出现时记录当前长度及substring。然后移动i, 同时减小字符频率统计直到有一个要求字符被丢掉时停止,再前进j, 不断重复。这个题我觉得思路不难,但实现起来不容易写。(真正要是在interview时我写得还是慢。。。)
因为给定的alphabet是个string, 我需要转化成unordered_set<char> (hashset)提高时间效率。整体i, j至多扫描string一遍O(N) + 转化alphabet为hashset的O(M)时间。
大家还有什么办法?
- string minSubstr(string& s, string& alphabet) {
- int n = s.length(), m = alphabet.size();
- string res; // result to hold required min substring
- if (n < m || n == 0) return res;
- int i = 0, j = -1, minlen = n;
- unordered_map<char, int> freq; // char frequency of substring
- unordered_set<char> chars; // all chars in alphabet
- for (char& c:alphabet) chars.insert(c); // O(m)
-
- while (++j < n) { // O(n)
- // if a new char in alphabet encountered
- if (chars.count(s[j]) && !freq.count(s[j])) m--;
- freq[s[j]]++;
-
- // have all chars in alphabet
- while (m == 0) {
- if (j-i+1 < minlen) { // better substring found
- minlen = j-i+1; res = s.substr(i, j-i+1);
- }
- i++; // drop first char in substring
- if (--freq[s[i]] == 0) {
- freq.erase(s[i]);
- if (chars.count(s[i])) m++; // miss a char in alphabet
- }
- }
- }
- return res;
- }
复制代码
补充内容 (2016-10-30 05:41):
若根本找不到要求的substring我的算法就返回空string |
|