1. 程式人生 > 其它 >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; };