【刷题日记】哈希表-找到字符串中所有字母异位词-L438-Medium
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
学习点
- 构建哈希表的键的取值,滑动窗口在移动的同时只需要两端的字母的数量自减或自加即可,大大节省时间开销。
代码
超出时间限制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: vector<int> findAnagrams(string s, string p) { if (s.length() < p.length()) { return {}; } int len = p.length(); unordered_map<string, vector<int>> um; for (int i = 0; i < s.length(); i++) { string key = s.substr(i, len); sort(key.begin(), key.end()); um[key].emplace_back(i); } sort(p.begin(), p.end()); return um[p]; } };
|
滑动窗口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Solution { public: vector<int> findAnagrams(string s, string p) { int s_len = s.length(); int p_len = p.length(); if (s_len < p_len) return {}; vector<int> s_counts(26, 0); vector<int> p_counts(26, 0); vector<int> ans; for (int i = 0; i < p_len; ++i) { ++s_counts[s[i] - 'a']; ++p_counts[p[i] - 'a']; } for (int i = 0; i < s_len - p_len; ++i) { if (s_counts == p_counts) ans.emplace_back(i); --s_counts[s[i] - 'a']; ++s_counts[s[i + p_len] - 'a']; }
if (s_counts == p_counts) ans.emplace_back(s_len - p_len);
return ans; } };
|