字典树C++算法详解

字典树(Trie树)是一种用于高效存储和检索字符串数据集中的键值对的树形结构。在编程实践中,字典树常用于自动补全、拼写检查、IP路由(最长前缀匹配)等场景。下面是使用C++实现的一个基本字典树的算法详解。

字典树的基本结构

字典树的节点通常包含以下几个部分:

  1. 一个布尔值,用来标记当前节点是否是一个单词的结尾。
  2. 一个指针数组,通常是26个(对应26个字母),用来指向子节点。

字典树的基本操作

  1. 插入(Insert):将一个单词添加到字典树中。
  2. 搜索(Search):查找字典树中是否存在一个单词。
  3. 前缀搜索(StartsWith):查找字典树中是否存在以某个前缀开头的单词。

C++实现

#include <iostream>
#include <vector>
using namespace std;

// 定义字典树节点结构
struct TrieNode {
    bool isEnd; // 标记单词结尾
    TrieNode* children[26]; // 子节点指针数组

    TrieNode() {
        isEnd = false;
        for (int i = 0; i < 26; i++) {
            children[i] = nullptr;
        }
    }
};

// 字典树类
class Trie {
private:
    TrieNode* root; // 根节点

public:
    Trie() {
        root = new TrieNode();
    }

    // 插入单词
    void insert(string word) {
        TrieNode* node = root;
        for (char c : word) {
            if (node->children[c - 'a'] == nullptr) {
                node->children[c - 'a'] = new TrieNode();
            }
            node = node->children[c - 'a'];
        }
        node->isEnd = true; // 单词结束标记
    }

    // 搜索单词
    bool search(string word) {
        TrieNode* node = root;
        for (char c : word) {
            if (node->children[c - 'a'] == nullptr) {
                return false;
            }
            node = node->children[c - 'a'];
        }
        return node->isEnd; // 判断是否为单词结尾
    }

    // 前缀搜索
    bool startsWith(string prefix) {
        TrieNode* node = root;
        for (char c : prefix) {
            if (node->children[c - 'a'] == nullptr) {
                return false;
            }
            node = node->children[c - 'a'];
        }
        return true; // 找到前缀即可
    }
};

int main() {
    Trie trie;
    trie.insert("apple");
    cout << trie.search("apple") << endl; // 输出 1
    cout << trie.search("app") << endl; // 输出 0
    cout << trie.startsWith("app") << endl; // 输出 1
    return 0;
}

在这段代码中,我们首先定义了一个TrieNode结构体,然后创建了一个Trie类,其中包含了插入(insert)、搜索(search)和前缀搜索(startsWith)等主要方法。

  • insert方法用于将单词添加到字典树中,通过遍历单词的每个字符来构建字典树的路径。
  • search方法用于检查字典树中是否存在整个输入的单词。
  • startsWith方法用于检查字典树中是否存在以给定前缀开头的单词。

每个节点都包含一个布尔值isEnd来标记是否为单词的结尾,这有助于我们区分单词和单词的前缀。

注意,这段代码假设所有输入的单词都是小写字母,并且没有特殊字符。在实际应用中,可能需要根据具体情况进行调整,比如支持大写字母、特殊字符等。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值