HDU 1251 统计难题

问题:只出现小写字母

输入:输入数据的第一部分是一张单词表,单词长度不超过10,它们代表的是老师交给同学统计的单词。一个空行代表单词表的结束。第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串。本题只有一组测试数据,处理到文件结束。

输出:对于每个提问,给出以该字符串为前缀的单词的数量。

Sample Input
   
   
   
   
banana band bee absolute acm ba b band abc
 

Sample Output
   
   
   
   
2 3 1 0
本题思路:采用字典树的方法,定义出字典树类,还有内部的字典树节点类,然后遍历

import java.util.*;

public class TrimTree {                                              //字典树类
	public class TrimTreeNode {                                      //字典树中的节点类,成员有节点字符、节点值、节点的子节点集合
		char ch;
		int ncount;
		TrimTreeNode[] next;

		TrimTreeNode(char cha) {
			this.ch = cha;
			ncount = 1;
			next = new TrimTreeNode[26];
		}

		TrimTreeNode() {
			ncount = 1;
			next = new TrimTreeNode[26];
		}
	}

	public void addWord(TrimTreeNode node, String str) {              //给字典添加单词的方法
		char[] letters = str.toCharArray();
		for (int i = 0; i < letters.length; i++) {
			int index = letters[i] - 'a';
			if (node.next[index] == null) {
				node.next[index] = new TrimTreeNode(letters[i]);
			} else
				node.next[index].ncount++;
			node = node.next[index];
		}
	}

	public int searchPre(TrimTreeNode node, String pre) {             //在字典中遍历单词前缀的方法
		char[] letters2 = pre.toCharArray();
		for (int i = 0; i < letters2.length; i++) {
			int index = letters2[i] - 'a';
			if (node.next[index] != null)
				node = node.next[index];
			else
				return 0;
		}
		return node.ncount;
	}

	public static void main(String[] args) {
		TrimTree tt = new TrimTree();
		TrimTreeNode root = tt.new TrimTreeNode();                     //创建根节点,根节点无节点字符
		Scanner cin = new Scanner(System.in);
		while (cin.hasNext()) {
			String word = cin.nextLine();
			if (word.length() == 0 || word == null)
				break;
			tt.addWord(root, word);                                    //将读入的单词添加进字典
		}
		while (cin.hasNext()) {
			String pre = cin.next();
			System.out.println(tt.searchPre(root, pre));               //搜索单词前缀出现的次数
		}
	}
}


你可能感兴趣的:(ACM,字典树)