题解 | #接头密匙#

接头密匙

https://www.nowcoder.com/practice/c552d3b4dfda49ccb883a6371d9a6932

#include<bits/stdc++.h>
using namespace std;

const int N = 450;
//  0   1   2   3   4   5   6   7   8   9  10  11
// '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '-' '#' 
class Solution 
{
private:
    vector<int> ans;
    int cnt; // 当前结点(第几个结点)
    int Tree[N][26]; // 结点路径记录表
    int pass[N]; // 该结点的通过数
    int endd[N]; // 该结点作为末尾数

private:
    string vec_to_str(vector<int> arr)
    {
        string ans;
        ans.clear();

        for(int i=1 ; i<=arr.size()-1 ; i++)
        {
            ans.append(to_string(arr[i]-arr[i-1]));
            ans+='#';
        }
        return ans;
    }

    // 12种方向的转化:
    int transform(const char& c)
    {
        // '0' ~ '9' 
        if((c>='0') && (c<='9'))
        {
            return (c-'0');
        }
        // '-'
        else if(c=='-')
        {
            return 10;
        }
        else
        {
            return 11;
        }
    }

    // 插入单词到字典树中
    void word_insert(string word)
    {
        int tool=1;
        int path=0;

        pass[tool]++;

        for(const auto& c : word)
        {
            path = transform(c);

            if(Tree[tool][path]==0)
            {
                Tree[tool][path] = ++cnt;
            }

            tool = Tree[tool][path];
            pass[tool]++;
        }

        endd[tool]++;

        return;
    }

    // 在字典树中找单词
    int word_find(string word)
    {
        int tool=1;
        int path=0;

        for(const auto& c : word)
        {
            path = transform(c);
            if(Tree[tool][path]==0)
            {
                return 0;
            }
            else
            {
                tool = Tree[tool][path];
            }
        }

        return pass[tool];
    }

    void word_clear()
    {
        memset(&Tree[0][0] , 0 , sizeof(int)*12*(cnt+1));
        memset(&pass[0] , 0 , sizeof(int)*(cnt+1));
        memset(&endd[0] , 0, sizeof(int)*(cnt+1));
        cnt=1;
    }
public:
    // 求与 b[x] 一致的 a[y] 有几个 ===> 拿着 b[x] 去找 a[y]
    vector<int> countConsistentKeys(vector<vector<int> >& b, vector<vector<int> >& a) 
    {   
        cnt=1;
        // 答案:
        ans.clear();

        // 将 a 作为答案放入 Trie
        for(const auto& e : a) // e 是 a[i]
        {
            word_insert(vec_to_str(e)); // 将 e 变成 word 再加入字典树
        }

        //
        for(const auto& e : b) // e 是 b[i]
        {
            ans.push_back(word_find(vec_to_str(e))); // 在 a 中找 b 为前缀的单词
        }

        word_clear(); // 重置字典树

        return ans;
    }
};
#trie#
全部评论

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
诨号无敌鸭:恭喜佬,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务