[プログラマー9992][2020 kakakao]歌詞検索問題を解く


  • 正解率
  • 精度:34.4%
  • 効率:0.8%
  • クイズクリップ
  • 👓 問題の概要


    あなたはTRIEの資料構造ではありませんか?
    詳細については、Programmersのホームページを参照してください.問題に答える

    🔑 問題を解く


    木じゃなくてT.R.I.E
    TRIEデータ構造は、単語の各文字をノードとして扱い、データを格納するデータ構造である.
    詳細:🛴 見に行く
    Trieを使ったから解けるんじゃないの?現れると資料が調べられない.
    したがって、これは非常にクレイジーな問題であり、各ワードの長さと、各ノードにそのノードを通過した人がどれだけいるかを格納し、入力された情報を両側から検索する必要がある.

    🥽 ソースコードとソースコード分析


    プログラマサイトから解放され、直接インポートされたコード.
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    struct Trie {
        int data;
        Trie *node[26];
    };
    
    bool makeTree(string& word, Trie &node, int idx, bool mode); //if exist then true, else false
    int findWord(string& word, Trie &node, int idx);
    Trie head[10020];
    Trie tail[10020];
    
    
    vector<int> solution(vector<string> words, vector<string> queries) {
        vector<int> answer;
    
        for (size_t i = 0; i < words.size(); i++)
        {
            int length = words[i].size();
            if (!makeTree(words[i], head[length], 0, true)) {
                head[length].data++;
            }
        }
    
        for (size_t i = 0; i < words.size(); i++)
        {
            int length = words[i].length();
            if (!makeTree(words[i], tail[length], length - 1, false)) {
                tail[length].data++;
            }
        }
        for (size_t i = 0; i < queries.size(); i++)
        {
            int length = queries[i].size();
            int count = 0;
            while (queries[i][count] == '?') count++;
            if (count == length) {
                answer.push_back(head[count].data);
            }
            else if (queries[i][0] == '?') {
                reverse(queries[i].begin(), queries[i].end());
                answer.push_back(findWord(queries[i], tail[length], 0));
            }
            else {
                answer.push_back(findWord(queries[i], head[length], 0));
            }
        }
        return answer;
    }
    bool makeTree(string& word, Trie& node, int idx, bool mode){
        //node[alphabet] = 자식
        if (mode && word.length() <= idx) return false;
        if (!mode && idx < 0) return false;
        if (node.node[word[idx] - 'a'] == NULL) {
            node.node[word[idx] - 'a'] = new Trie();
        }
        else if (mode && idx == word.length() - 1 && node.node[word[idx] - 'a'] != NULL) {
            return true;
        }
        else if (!mode && idx == 0 && node.node[word[idx] - 'a'] != NULL) {
            return true;
        }
        if (mode == true) {
            if (!makeTree(word, *node.node[word[idx] - 'a'], idx + 1, mode)) {
                node.node[word[idx] - 'a']->data++;
                return false;
            }
            else {
                return true;
            }
        }
        else {
            if (!makeTree(word, *node.node[word[idx] - 'a'], idx - 1, mode)) {
                node.node[word[idx] - 'a']->data++;
                return false;
            }
            else {
                return true;
            }
        }
    
    
        return false;
    }
    int findWord(string& word, Trie& node, int idx) {
    
        if (&node == NULL) {
            return 0;
        }
        if (node.node[word[idx] - 'a'] == NULL && idx == word.length() - 1) {
            return node.data;
        }
        else if (node.node[word[idx] - 'a'] == NULL && idx != word.length() - 1) {
            return 0;
        }
        if (word.length() == idx - 1) {
            return node.node[word[idx] - 'a']->data;
        }
        if (word[idx + 1] == '?') {
            return node.node[word[idx] - 'a']->data;
        }
        return findWord(word, *node.node[word[idx] - 'a'], idx + 1);
    }

    🔨 問題ポスト


    私のソースコードより上手な人が多いので、探してみることをお勧めします.私も難しいのが苦手です.(●'◡'●)
    もしあなたが時間内にこのような難しい問題を解決することができたら、あなたは最も実力のある人です!まず解いてみてから解いてみよう!