leetcode 找出字符串所有字母异位词 中等
作者:互联网
前缀和是可以的,时间 O(n * 26),空间 O(n * 26)。然后其实可以优化,不需要前缀和,因为长度固定,每次只需要更改一个字母的次数。时间 O(n * 26),空间 O(26 * 2)
hash:将 a 当做 26 的 0 次方,b 当做 26 的 1 次方,即转换为 26 进制。时间 O(n),空间 O(n)
class Solution { public: vector<int> findAnagrams(const string &s, const string &p) { if(p.size() > s.size() || s.empty() || p.empty()) return {}; vector<ull> hashs; // hash[i + 1] 表示到 index i 的 hash 值 vector<ull> pow26; // pow26[i] = 26 的 i 次方, 分别表示 a ~ z 的值 for(int i = 0; i < 26; ++ i) { if(i == 0) { pow26.emplace_back(1); continue; } pow26.emplace_back(pow26.back() * base); } for(int i = 0; i < s.size(); ++ i) { if(i == 0) { hashs.emplace_back(0); } hashs.emplace_back(hashs.back() + pow26[s[i] - 'a']); } ull hashx = 0; for(int i = 0; i < p.size(); ++ i) { hashx += pow26[p[i] - 'a']; } vector<int> ret; for(int i = 0; i < s.size() && i + p.size() <= s.size(); ++ i) { if(hashx == hashs[i + p.size()] - hashs[i]) { ret.push_back(i); } } return ret; } private: typedef unsigned long long ull; ull base = 26; };
标签:26,emplace,int,异位,back,pow26,字符串,leetcode,size 来源: https://www.cnblogs.com/rookie-acmer/p/15171900.html