实现前缀树
class Trie {
class TrieNode {
boolean end;
TrieNode[] tns = new TrieNode[26];
}
TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String s) {
TrieNode p = root;
for(int i = 0; i < s.length(); i++) {
int u = s.charAt(i) - 'a';
if (p.tns[u] == null) p.tns[u] = new TrieNode();
p = p.tns[u];
}
p.end = true;
}
public boolean search(String s) {
TrieNode p = root;
for(int i = 0; i < s.length(); i++) {
int u = s.charAt(i) - 'a';
if (p.tns[u] == null) return false;
p = p.tns[u];
}
return p.end;
}
public boolean startsWith(String s) {
TrieNode p = root;
for(int i = 0; i < s.length(); i++) {
int u = s.charAt(i) - 'a';
if (p.tns[u] == null) return false;
p = p.tns[u];
}
return true;
}
}
class Solution {
public String replaceWords(List<String> dictionary, String sentence) {
WordDictionary wd = new WordDictionary();
for (int i = 0; i < dictionary.size(); i++) {
wd.addWord(dictionary.get(i));
}
final String[] s = sentence.split(" ");
for (int i = 0; i < s.length; i++) {
s[i] = wd.searchDict(s[i]);
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i <s.length; i++) {
sb.append(s[i]).append(" ");
}
return sb.toString().trim() ;
}
}
public class WordDictionary {
TrieNode root;
class TrieNode {
private TrieNode[] nodes;
public int value;
public boolean isWord;
public TrieNode() {
nodes = new TrieNode[26];
}
}
public WordDictionary() {
root = new TrieNode();
}
//添加单词
public void addWord(String word) {
addWord(word,0);
}
public void addWord(String word,int value) {
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
if (node.nodes[word.charAt(i) - offset] == null) {
node.nodes[word.charAt(i) - offset] = new TrieNode();
}
node = node.nodes[word.charAt(i) - offset];
}
node.value=value;
node.isWord = true;
}
//搜索单词前缀
public String searchDict(String prefix) {
String result = prefix;
TrieNode node = root;
for (int i = 0; i < prefix.length()&&node!=null ; i++) {
node = node.nodes[prefix.charAt(i)-offset];
if (node==null){
return prefix;
}else if (node.isWord){//
return prefix.substring(0,i+1);
}
}
//当查询的单词中含有通配符时
return result;
}
}
class MapSum {
WordDictionary wd;
/** Initialize your data structure here. */
public MapSum() {
wd = new WordDictionary();
}
public void insert(String key, int val) {
wd.addWord(key,val);
}
public int sum(String prefix) {
return wd.searchPrefix(prefix);
}
}
class WordDictionary {
int offset = 97;
TrieNode root;
class TrieNode {
private TrieNode[] nodes;
public int value;
public boolean isWord;
public TrieNode() {
nodes = new TrieNode[26];
}
}
public WordDictionary() {
root = new TrieNode();
}
public void addWord(String word,int value) {
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
if (node.nodes[word.charAt(i) - offset] == null) {
node.nodes[word.charAt(i) - offset] = new TrieNode();
}
node = node.nodes[word.charAt(i) - offset];
}
node.value=value;
node.isWord = true;
}
public int searchPrefix(String prefix) {
int result = 0;
TrieNode node = root;
for (int i = 0; i < prefix.length() ; i++) {
node = node.nodes[prefix.charAt(i)-offset];
if (node!=null){
result =node.value;
}else {
result =0;
break;
}
}
//计算当前节点下的数量
if (node!=null){
result = nodeValue(node);
}
//当查询的单词中含有通配符时
return result;
}
private int nodeValue(TrieNode node){
int value =0;
if (node==null){
return value;
}
if (node.isWord){
value = node.value;
};
for (int i = 0; i < node.nodes.length; i++) {
value+= nodeValue(node.nodes[i]);
}
return value;
}
}
class WordsFrequency {
WordDictionary wd;
public WordsFrequency(String[] book) {
wd = new WordDictionary();
for (int i = 0; i < book.length; i++) {
wd.addWord1(book[i]);
}
}
public int get(String word) {
return wd.search(word);
}
}
class WordDictionary {
int offset = 97;
TrieNode root;
class TrieNode {
private TrieNode[] nodes;
public int value;
public boolean isWord;
public TrieNode() {
nodes = new TrieNode[26];
}
}
public WordDictionary() {
root = new TrieNode();
}
public void addWord(String word) {
addWord(word,0);
}
public void addWord(String word,int value) {
// 是否已经存在
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
if (node.nodes[word.charAt(i) - offset] == null) {
node.nodes[word.charAt(i) - offset] = new TrieNode();
}
node = node.nodes[word.charAt(i) - offset];
}
node.value=value;
node.isWord = true;
}
public int search(String prefix) {
TrieNode node = root;
for (int i = 0; i < prefix.length()&&node!=null; i++) {
node = node.nodes[prefix.charAt(i)-offset];
}
int value=0;
//计算当前节点下的数量
//当查询的单词中含有通配符时
if (node!=null&&node.isWord){
value = node.value;
}
return value;
}
}
class Solution {
public List<List<String>> suggestedProducts(String[] products, String searchWord) {
WordDictionary wd = new WordDictionary();
for (int i = 0; i < products.length; i++) {
wd.addWord(products[i]);
}
List<List<String>> lists = new ArrayList<>();
for (int i = 1; i <searchWord.length()+1 ; i++) {
System.out.println(searchWord.substring(0,i));
List<String> result = wd.searchProduct(searchWord.substring(0,i));
if (result.size()>3){
Collections.sort(result);
lists.add(result.subList(0,3));
}else {
lists.add(result);
}
}
return lists;
}
}
class WordDictionary {
int offset = 97;
TrieNode root;
class TrieNode {
private TrieNode[] nodes;
public int value;
public boolean isWord;
public TrieNode() {
nodes = new TrieNode[26];
}
}
public WordDictionary() {
root = new TrieNode();
}
public void addWord(String word) {
addWord(word,0);
}
public void addWord(String word,int value) {
// 是否已经存在
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
if (node.nodes[word.charAt(i) - offset] == null) {
node.nodes[word.charAt(i) - offset] = new TrieNode();
}
node = node.nodes[word.charAt(i) - offset];
}
node.value=value;
node.isWord = true;
}
public List<String> searchProduct(String prefix) {
List<String> result = new ArrayList<>();
TrieNode node = root;
for (int i = 0; i < prefix.length()&&node!=null; i++) {
node = node.nodes[prefix.charAt(i)-offset];
}
//计算当前节点下的数量
if (node!=null){
nodeProduct(node,new StringBuffer(prefix),result);
}
//当查询的单词中含有通配符时
return result;
}
private void nodeProduct(TrieNode node,StringBuffer prefix,List<String> result){
if (node.isWord){
result.add(prefix.toString());
}
for (int i = 0; i < node.nodes.length; i++) {
if (node.nodes[i]!=null){
prefix.append((char)(offset+i));
nodeProduct(node.nodes[i],prefix,result);
prefix.delete(prefix.length()-1,prefix.length());
}
}
}
}
class StreamChecker {
//字典树对象
WordDictionary wordDictionary;
//存放输入的字符
StringBuffer csb;
//初始,添加单词
public StreamChecker(String[] words) {
wordDictionary = new WordDictionary();
csb = new StringBuffer();
for (int i = 0; i < words.length; i++) {
StringBuffer sb = new StringBuffer(words[i]);
//添加单词市需要将单词反转,如:abc专网cba
wordDictionary.addWord(sb.reverse().toString());
}
}
//查询
public boolean query(char letter) {
csb.append(letter);
//不能直接在csb上反转,需要新建StringBuffer进行反转字符串
StringBuffer sb = new StringBuffer(csb);
//反转字符串
String string = sb.reverse().toString();
boolean ans = wordDictionary.searchPrefix(string);
return ans;
}
}
//字典树的事项,只实现了添加单词addWord,根据前缀查询单词功能searchPrefix
public class WordDictionary {
int offset = 97;
TrieNode root;
class TrieNode {
//小写字符数组
private TrieNode[] nodes;
public int value;
//是否是单词
public boolean isWord;
public TrieNode() {
nodes = new TrieNode[26];
}
}
public WordDictionary() {
root = new TrieNode();
}
//添加单词
public void addWord(String word) {
addWord(word,0);
}
public void addWord(String word,int value) {
TrieNode node = root;
//添加单词字符
for (int i = 0; i < word.length(); i++) {
//不存在字符就新建
if (node.nodes[word.charAt(i) - offset] == null) {
node.nodes[word.charAt(i) - offset] = new TrieNode();
}
//存在直接获取当前字符
node = node.nodes[word.charAt(i) - offset];
}
node.value=value;
node.isWord = true;
}
//根据前缀查询单词,遇到单词就结束
public boolean searchPrefix(String prefix) {
TrieNode node = root;
for (int i = 0; i < prefix.length()&&node!=null; i++) {
node = node.nodes[prefix.charAt(i)-offset];
//遇到单词就返回true
if (node!=null&&node.isWord){
return true;
}
}
//前缀不能匹配,返回 false
return false;
}
}