leetcode-211. 添加与搜索单词

技术leetcode-211. 添加与搜索单词 leetcode-211. 添加与搜索单词 - 数据结构设计leetcode-211. 添加与搜索单词 - 数据结构设计
题目:
请你设计一个数据结构,支

Leetcode-211。添加和搜索单词-数据结构设计。

leetcode-211. 添加与搜索单词 - 数据结构设计

题目:

请设计一个支持添加新单词的数据结构,并找出字符串是否匹配任何以前添加的字符串。

实现字典类单词字典:

WordDictionary()初始化字典对象。

空添加单词(word)将单词添加到数据结构中,然后就可以匹配了。

如果数据结构中的字符串与word匹配,Bool search(word)返回true否则,返回false。单词可能包含一些“.”,和每个。可以代表任何字母。

思路:

Ontology直接将所有单词存储在数组中,在搜索时遍历所有单词,但这种代码搜索效率低,可能会超时,所以我们可以根据代码对单词进行分类,并存储在map int mapint、vectorstring的数据结构中,其中map的关键是长度,值是对应长度的单词。插入单词时,先计算单词长度,然后再将其插入相应的数组。搜索时,直接根据字长找到对应的集合,遍历集合中的所有单词,然后进行逐字符匹配。如果是“.”,跳过这一次,如果匹配成功,则返回true。

这个问题也可以通过前缀树来解决,因为只有26个单词,所以构造的字典树是一个26分支的树,并且设置了一个标志isEnd来记录这个字母是否是单词的结尾。

数据结构:

类TrieNode{

公众号:

//存储子节点。

vectorTrieNode *子级;

//结束符号。

bool isEnd

TrieNode(){ 0

//初始化子节点。

child=vectorTrieNode * { 26,nullptr };

//默认设置为false,插入时将最后一个字母的标志设置为true。

isEnd=false

};

};

插入元素时,单词通过遍历合并到前缀树中。

当寻找元素时,

如果遍历到单词的末尾,则表示该单词匹配成功,并返回true。

如果单个当前字母为a-z,则递归判断trie-child[word[i]-'a']和word[i 1:]的查询结果。

如果当前遍历的字母是“.”,需要递归搜索每个子节点。

Code

地图收藏

类单词词典(}

公众号:

mapint,vectorstring m;

word dictionary(){ 0

}

void addWord(字符串单词){ 0

if(m . count(word . size())==0){ 0

vectorstring cur={ word };

m[word . size()]=cur;

}

else{

m[word.size()]。push_back(单词);

}

}

bool搜索(字符串)

int len=word . size();

if(m . count(len)=0)

返回false

}

for(auto item :m[word . size()]){ 0

bool have=true

for(int I=0;伊琳;I){ 0

if(word[i]!='.'字[我]!=项目[I]){ 0

have=false

}

}

如果有

返回真;

}

}

返回false

}

};

前缀树

类TrieNode{

公众号:

vectorTrieNode *子级;

bool isEnd

TrieNode(){ 0

child=vectorTrieNode * { 26,nullptr };

isEnd=false

};

};

类单词词典(}

公众号:

TrieNode * root

word dictionary(){ 0

root=new TrieNode();

}

void addWord(字符串单词){ 0

TrieNode * cur=root

for(int I=0;iword . size();I){ 0

if(cur-child[word[I]-' a ']==nullptr){ 0

cur-child[word[I]-' a ']=new TrieNode();

}

cur=cur-child[word[I]-' a '];

}

//结束标志设置为真。

cur-isEnd=true;

};

bool搜索(字符串)

TrieNode * cur=root

//递归查询

返回dfs(cur,0,word);

};

bool dfs(TrieNode* root,int inx,string word){ 0

//找到最后。

if(inx==word . size()){ 0

返回root-isEnd;

};

//当你遇到“.”,您需要遍历所有26个字母一次。

if(word[inx]==' . '){

for(int I=0;i26I){ 0

if(root-child[i]!=nullptr dfs(根-子[i],inx 1,word)){ 0

返回真;

}

}

返回false

}

else{

if(root-child[word[inx]-'a']!=nullptr dfs(根-子[word[inx]-'a'],inx 1,word)){ 0

返回真;

}

返回错误的

};

};

};

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/37487.html

(0)

相关推荐

  • 如何理解一致性hash算法和实现

    技术如何理解一致性hash算法和实现本篇文章给大家分享的是有关如何理解一致性hash算法和实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一致性hash算

    攻略 2021年11月24日
  • 怎么进行Spring-Retry的使用

    技术怎么进行Spring-Retry的使用怎么进行Spring-Retry的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 Spring-Retr

    攻略 2021年11月11日
  • innodb的基础(innodb使用技巧)

    技术InnoDB基础知识点有哪些这篇文章给大家分享的是有关InnoDB基础知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、关于count(*)知识点:MyISAM会直接存储总行数

    攻略 2021年12月22日
  • 和田玉怎样鉴别,怎么判断一块和田玉的好坏

    技术和田玉怎样鉴别,怎么判断一块和田玉的好坏如何区分和田玉的好坏和田玉怎样鉴别?和田玉深受中国人的喜爱,和田玉文化又是中国玉文化的重要代表,是中国传统文化的重要组成部分。和田玉在古代又称昆仑玉,主要来源于昆仑山脉中,和田

    生活 2021年10月26日
  • 怎样用Java final 关键字

    技术怎样用Java final 关键字怎样用Java final 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面好好地讲一讲 final 关键字,

    攻略 2021年12月2日
  • 对长亭晚,杯杯敬的有钱人这一首诗什么诗

    技术对长亭晚,杯杯敬的有钱人这一首诗什么诗《诗经》死生契阔对长亭晚,与子成说。执子之手,与子偕老。《邶风·击鼓》
    今夕何夕,见此良人。《唐风·绸缪》
    青青子衿,悠悠我心。《郑风·子衿》
    手如柔荑,肤如凝脂,领如蝤蛴,齿如

    生活 2021年10月29日