leetcode 找出字符串所有字母异位词 中等

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;
};

 

上一篇:push_back()和emplace_back()的区别


下一篇:emplace系列函数