剑指 Offer II Trie前缀树

初始化

数组初始化在class外的话 要memset 在主函数里面memset

在class内不用

062. 实现前缀树

class Trie {
public:
    /** Initialize your data structure here. */

    int son[100010][26],cnt[100010],idx=0;
    Trie() {
        memset(son,0,sizeof son);
    }
    
    /** Inserts a word into the trie. */
    void insert(string word) {
        int p=0;
        for( char c: word)
        {
           int u=c-'a';
           if(!son[p][u])son[p][u]=++idx;
           p=son[p][u];
        }
        cnt[p]++;
    }
    
    /** Returns if the word is in the trie. */
    bool search(string word) {
        int p=0;
        for(char c:word){
            int u=c-'a';
            if(!son[p][u])return false;
            p=son[p][u];
        }
        return cnt[p]>0;

    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
         int p=0;
        for(char c:prefix){
            int u=c-'a';
            if(!son[p][u])return false;
            p=son[p][u];
        }
        return true;
    }
};

063. 替换单词

class Solution {
public:
    int son[100010][26],cnt[100010],idx=0;
    void insert(string s)
    {
        int p=0;
        for(char c:s)
        {
            int u=c-'a';
            if(!son[p][u])son[p][u]=++idx;
            p=son[p][u];
        }
        cnt[p]++;
    }
    string check(string s)
    {
        string res;
        int p=0;
        for(char c:s)
        {
            int u=c-'a';
            if(!son[p][u])break;
            res+=c;
            p=son[p][u];
            if(cnt[p])return res;
        }
        if(cnt[p])return res;
        return "";

    }
    string replaceWords(vector<string>& dictionary, string sentence) {
        for(auto s:dictionary)insert(s);
         stringstream ssin(sentence);
         string ans,word;
         while(ssin >>word)
         {
             //cout<<word<<"..."<<endl;
             string x=check(word);
           //  cout<<x<<endl;
             
             if(x!="")
             {
                 ans+=x;
             }
             else ans+=word;
             ans+=" ";
         }
         return ans.substr(0,ans.size()-1);

    }
};

064. 神奇的字典

  const int N=10001;
    int son[N][26],cnt[N],idx=0;
class MagicDictionary {
public:
    /** Initialize your data structure here. */

    MagicDictionary() {
        memset(son,0,sizeof son);
          memset(cnt,0,sizeof cnt);
          idx=0;

    }
    void insert(string s)
    {
        int p=0;
        for(char c:s)
        {
            int u=c-'a';
            if(!son[p][u])son[p][u]=++idx;
            p=son[p][u];
        }
        cnt[p]++;
    }
    
    void buildDict(vector<string> dictionary) {
        for(auto s:dictionary)insert(s);

    }
    bool dfs(string s,int p,int u,int op)
    {
        if(cnt[p]&&u==s.size()&&op==1)return true;//必须替换一个
        if(op>1||s.size()==u)return false;

        //枚举改的字母
        for(int i=0;i<26;i++)
        {
            if(!son[p][i])continue;

            if(dfs(s,son[p][i],u+1,op+(s[u]-'a'!=i)))return true;
        }
        return false;

    }
    bool search(string searchWord) {
        return dfs(searchWord,0,0,0);
    }
};

065. 最短的单词编码

const int N=2000*7+10;

int son[N][26],cnt[N],len[N],idx=0;

class Solution {
public:
/*
这题是求叶节点长度
*/
   
    void insert(string s)
    {
        reverse(s.begin(),s.end());
        int p=0;
        for(char c:s)
        {
            int u=c-'a';
            if(!son[p][u])son[p][u]=++idx;
            cnt[p]++;
            p=son[p][u];
        }
        len[p]=s.size();
    }
    int minimumLengthEncoding(vector<string>& words) {
 memset(son,0,sizeof son);
    //cnt 我有多少个叶节点 0的话我就是
    memset(cnt,0,sizeof cnt);//因为len依赖cnt 所以不用初始化
    idx=0;
        for(auto x:words)insert(x);
        int res=0;
        for(int i=1;i<=idx;i++)
        if(!cnt[i])res+=len[i]+1;
        return res;

    }
};

066. 单词之和

找到p再深搜

const int N=2501; 
int son[N][26],cnt[N],idx=0;
class MapSum {
public:
    /** Initialize your data structure here. */
    MapSum() {
        memset(son,0,sizeof son);
        memset(cnt,0,sizeof cnt);
        idx=0;

    }
    
    void insert(string key, int val) {
        int p=0;
        for(char c:key)
        {
            int u=c-'a';
            if(!son[p][u])son[p][u]=++idx;
            p=son[p][u];
        }
        cnt[p]=val;
    }
    int getp(string s)
    {
        int p=0;
        for(char c:s)
        {
            int u=c-'a';
            if(!son[p][u])return 0;
            p=son[p][u];
        }
        return p;
    }
    int dfs(int p)
    {
        int sum=0;
        if(cnt[p])sum+=cnt[p];
        for(int i=0;i<26;i++)
        {
            if(son[p][i])sum+=dfs(son[p][i]);
        }
        return sum;
    }
    
    int sum(string prefix) {
        int p=getp(prefix);
        if(p==0)return 0;
        return dfs(p);

    }
};

067. 最大的异或

class Solution {
public:
    int son[800001][2],idx=0;
    void insert(int x)
    {
        int p=0;
        for(int i=30;i>=0;i--)
        {
            int u=x>>i&1;
            if(!son[p][u])son[p][u]=++idx;
            p=son[p][u];
        }
    }
    int query(int x)
    {
        int p=0,res=0;
        for(int i=30;i>=0;i--)
        {
            int u=x>>i&1;
            if(son[p][!u])
            {
                res=res*2+1;
                p=son[p][!u];
            }
            else 
            {
                 res=res*2+0;
                p=son[p][u];
            }
        }
        return res;
    }
    int findMaximumXOR(vector<int>& nums) {
        for(int x:nums)insert(x);
        int res=0;
        for(int x:nums)res=max(res,query(x));
        return res;

    }
};
posted @ 2022-03-31 22:12  liv_vil  阅读(30)  评论(0)    收藏  举报