📜  使用所有后缀的特里搜索模式(1)

📅  最后修改于: 2023-12-03 15:22:23.972000             🧑  作者: Mango

使用所有后缀的特里搜索模式

Trie搜索是一种非常常见的数据结构,用于在一组字符串中查找目标字符串。

特里搜索可以方便地搜索具有相同前缀的字符串。

所有后缀的特里搜索模式可以用于搜索所有原始字符串的所有后缀。

思路

我们可以将所有字符串反转,并在反转后的字符串的Trie上应用搜索算法。这将匹配所有原始字符串的所有后缀。然后,我们可以使用反向索引以原始顺序获取后缀的列表。

代码实现

以下是使用C ++实现所有后缀的特里搜索模式的代码:

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

class TrieNode {
public:
    unordered_map<char, TrieNode*> children;
    bool isEndOfWord;

    TrieNode() {
        this->isEndOfWord = false;
    }

    ~TrieNode() {
        for (auto& pair : children) delete pair.second;
    }
};

class Trie {
public:
    TrieNode* root;

    Trie() {
        this->root = new TrieNode();
    }

    ~Trie() {
        delete root;
    }

    void insert(const string& str) {
        TrieNode* curr = root;
        for (int i = str.length() - 1; i >= 0; --i) {
            char c = str[i];
            if (!curr->children.count(c)) {
                curr->children[c] = new TrieNode();
            }
            curr = curr->children[c];
        }
        curr->isEndOfWord = true;
    }

    vector<string> getAllSuffix() {
        vector<string> result;
        string suffix;
        getAllSuffix(root, result, suffix);
        return result;
    }

private:
    void getAllSuffix(TrieNode* node, vector<string>& result, string& suffix) {
        if (node->isEndOfWord) {
            result.push_back(suffix);
        }

        for (auto& pair : node->children) {
            suffix.push_back(pair.first);
            getAllSuffix(pair.second, result, suffix);
            suffix.pop_back();
        }
    }
};

int main() {
    Trie trie;
    vector<string> v = {
        "hello",
        "world",
        "foobar",
        "baz",
    };

    for (const string& str : v) {
        trie.insert(str);
    }

    vector<string> suffixes = trie.getAllSuffix();
    for (const string& suffix : suffixes) {
        cout << suffix << endl;
    }
    return 0;
}
结论

所有后缀的特里搜索模式可用于在所有原始字符串的所有后缀中搜索目标字符串,以及查找字符串中最长的重复子字符串。

但是,在实现此搜索算法时,需要小心内存管理,避免内存泄漏和错误。