您的位置:首页 > 其它

【hihocoder】1014 : Trie树

2016-09-16 19:19 344 查看
题目懒得贴了。。

http://hihocoder.com/problemset/problem/1014

思路:

easy。。trie树。。。。不同点在于。。为了查询前缀效率更高,在该树中添加节点时,在添加过程中的节点都记录一下以该节点为父节点有多少个子节点。。。。。(说的我头都晕了,其实就是add word时,从root到新节点经过的路径上的每个节点记录值都加一)

算法:

import java.util.Scanner;

/**
* http://hihocoder.com/problemset/problem/1014 */
public class Main2 {

public static void main(String[] args) {
Main2 m = new Main2();
m.handleInput();
}

private TrieNode root;

public void handleInput() {
root = new TrieNode();
Scanner in = new Scanner(System.in);
int n = 0;
if (in.hasNext())
n = in.nextInt();
while (n > 0 && in.hasNext()) {
n--;
String s = in.next().trim();
addWord(s);
}

int m = 0;
if (in.hasNext())
m = in.nextInt();
while (m > 0 && in.hasNext()) {
m--;
String s = in.next().trim();
System.out.println(search(s, 0, root));
}
}

public void addWord(String word) {
TrieNode p = root;
for (int i = 0; i < word.length(); i++) {
char key = word.charAt(i);
if (p.nexts[key - 'a'] != null) {
p = p.nexts[key - 'a'];
} else {
TrieNode t = new TrieNode(key);
p.nexts[key - 'a'] = t;
p = t;
}
if (i == word.length() - 1) {
p.isword = true;
}
p.count++;
}
}

public int search(String word, int i, TrieNode p) {

if (i == word.length())
return p.count;

char key = word.charAt(i);

if (p.nexts[key - 'a'] != null)
return search(word, i + 1, p.nexts[key - 'a']);
else
return 0;
}

class TrieNode {
// Initialize your data structure here.
Character val;
TrieNode nexts[] = new TrieNode[26];
boolean isword = false;
int count = 0;// 经过该节点的word数目

public TrieNode(char key) {
val = key;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: