字典树实现map容器

通过hdoj1075来演示如何通过字典树创建map容器


字典树的结构如下


其中,根结点上不存储数据,每个结点有唯一的字符串(key)标示,可在对应的结点中存储相应的值(value),比如ah结点上可以存储数据"I am handsome!"

那么,对应的map中一条为["ah" -> "I am handsome!"],字典树的数据结构中最多有MAX个子树,假如由26个英文字母组成的字典树,那么MAX就是26

#include <iostream>
#include <string>
#define MAX 26
using namespace std;
//字典树的数据结构
struct Trie {
  Trie *next[MAX];
  string v;
  Trie():v("") {
    for (int i = 0; i < MAX; ++i) {
      next[i] = NULL;
    }
  }
};

Trie *root = new Trie();
//插入一条数据
void createTrie(const string& value,const string& key) {
    int len = key.size();
    Trie *p = root;
    for(int i = 0; i < len; ++i) {
        int id = key[i] - 'a';
        if (p->next[id] == NULL) {
          p->next[id] = new Trie();
        }
        p = p->next[id];
    }
    p->v = value;
}
//查找数据
const string& find(const string& key) {
    int len = key.size();
    Trie *p = root;
    for(int i = 0; i < len; ++i) {
        int id = key[i] - 'a';
        if (p->next[id] == NULL)  return key;
        p = p->next[id];
    }
    if (p->v == "") return key;
    else return p->v;
}

int main() {
 // freopen("1.in", "r", stdin);
  //建立字典树
  string key, value, s, tmp;
  cin >> value;
  while (cin >> value && value != "END") {
    cin >> key;
    createTrie(value, key);
  }
  getchar();
  getline(cin, tmp);
  while (getline(cin, tmp) && tmp != "END") {
    s += tmp + "\n";
  }
  tmp = "";
  for (int i = 0; i < s.length(); ++i) {
    if (s[i] > 'z' || s[i] < 'a')
      cout << s[i];
    else
      tmp += s[i];
    if (i == s.length() || (s[i+1] > 'z' || s[i+1] < 'a')) {
      cout << find(tmp);
      tmp = "";
    }
  }
  return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值