HDU 1251 统计难题

来源:互联网 发布:浪潮gs5.0 软件下载 编辑:程序博客网 时间:2024/05/24 01:11

问题:只出现小写字母

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

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

Sample Input
bananabandbeeabsoluteacmbabbandabc
 

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

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]);} elsenode.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];elsereturn 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));               //搜索单词前缀出现的次数}}}


0 0
原创粉丝点击