例:给出一个字符文本,每行一个字符串,统计不同的字符串出现的百分比,最后按ASCII排序输出不同字符串和出现的百分比。
分析:对输入字符串建立字典树,在叶子结点记录该字符串出现的次数。这样的话,最后DFS搜索就可以查找每个字符串出现的次数。
样例:
Sample Input
Red Alder
Ash
Aspen
Basswood
Ash
Beech
Yellow Birch
Ash
Cherry
Cottonwood
Ash
Cypress
Red Elm
Gum
Hackberry
White Oak
Hickory
Pecan
Hard Maple
White Oak
Soft Maple
Red Oak
Red Oak
White Oak
Poplan
Sassafras
Sycamore
Black Walnut
Willow
exit
Sample Output
Ash 13.7931
Aspen 3.4483
Basswood 3.4483
Beech 3.4483
Black Walnut 3.4483
Cherry 3.4483
Cottonwood 3.4483
Cypress 3.4483
Gum 3.4483
Hackberry 3.4483
Hard Maple 3.4483
Hickory 3.4483
Pecan 3.4483
Poplan 3.4483
Red Alder 3.4483
Red Elm 3.4483
Red Oak 6.8966
Sassafras 3.4483
Soft Maple 3.4483
Sycamore 3.4483
White Oak 10.3448
Willow 3.4483
Yellow Birch 3.4483
import java.util.Scanner;
import java.text.DecimalFormat;
class Trie{ //字典树
Trie next[] = new Trie[128];//所有儿子节点
int cnt;/* 用于记录单词出现的次数,若cnt大于0,说明
从根节点到此节点的父节点构成了一个单词,这个
单词的次数就是cnt */
public Trie(){
cnt = 0;
}
}
public class Main{
Trie root = new Trie();
String res;
int all = 0;
DecimalFormat a = new DecimalFormat("0.0000");
void solve() {
Scanner cin = new Scanner(System.in);
String input;
while(cin.hasNext()){//用所有字符串,构造字典树
input = cin.nextLine();
// if(input.equals("exit")) break;
insert(input.toCharArray());
}
res = "";
dfs(root);//深度优先搜索字典树
}
void insert(char[] str){//将一个字符串插入字典树
int len = str.length;
int k = 0, t;
Trie p = root;
while(k!=len){
t = str[k++];
if(p.next[t] == null) p.next[t] = new Trie();
p = p.next[t];
}
p.cnt++;//字符串的最后一个节点,根节点到此节点构成了一个单词,此单词的个数加1
all++;//字符串总数加1
}
void dfs(Trie p){
if(p.cnt!=0) System.out.println(res + " " + a.format(p.cnt*100.0/all));
for(int i=0;i< 128;i++){//遍历p的所有儿子节点(邻接点)
if(p.next[i] != null){
res+=(char)i;
dfs(p.next[i]);
res = res.substring(0, res.length()-1);//恢复现场
}
}
}
public static void main(String[] args) {
Main test = new Main();
test.solve();
}
}
源码:
分享到:
相关推荐
- **深度优先遍历(DFS)**:从某个顶点出发,尽可能深入地搜索树的分支。当遇到叶子节点时,再回溯到上一层继续探索其他分支。 - **广度优先遍历(BFS)**:从根节点开始,先访问所有与根节点相邻的顶点,然后再...
while循环用于删除ArrayList中的空字符串,而for循环用于遍历ArrayList并统计单词出现的次数。 知识点6:Java TreeMap的键值对操作 在本例中,我们使用了TreeMap的put方法来将单词和其出现的次数作为键值对存储在...
要求采用邻接矩阵作为无向图的存储结构,邻接表作为有向图的存储结构,完成无向图和有向图的建立,并对建立好的图进行深度和广度优先遍历。具体实现要求: 1. 通过键盘输入图的顶点和边信息,分别构造一个无向图的...
本文将详细讲解如何统计一篇文章中单词的个数,并找出出现频率最高的前15个单词。 首先,我们需要理解“统计单词”的基本概念。在计算机科学中,文本通常被看作字符序列,而单词则是由空格、标点符号或其他分隔符...
统计文本文件中一段英文中某个单词出现的次数及其出现的位置 本知识点介绍了一个使用 C++ 编程语言编写的程序,旨在统计给定英文文本文件中某个英文单词的出现次数及其出现的位置。下面是对该程序的详细解释: ...
统计单词的个数
在VB6.0环境下,统计文本单词的个数是一项常见的编程任务,这涉及到字符串处理、正则表达式以及循环结构等基础知识。以下是对这个主题的详细讲解: 首先,我们需要了解VB6.0的基础知识。Visual Basic 6.0是微软公司...
在本案例中,我们将利用二叉排序树来统计文本文件中单词的出现次数。 首先,我们需要定义二叉排序树的节点结构。节点通常包含三个部分:键(key,即我们要存储的单词)、左子节点和右子节点。在Python中,可以这样...
在本编程练习中,我们将探讨如何使用C语言来统计一个特定单词在文本文件中出现的次数。这个任务涉及到了文件操作、字符串处理以及指针的使用,这些都是C语言中的核心概念。下面,我们将深入讲解这些知识点。 首先,...
(4)输出深度优先遍历和广度优先遍历的结点访问序列; (5)并给出相应生成树的边集。 (6)给出至少3组测试数据,其中图顶点的个数大于10小于30。 较高要求:建立深度和广度生成树,按凹入表或树形打印生成树。
二叉树的各种遍历(前序、中序、后序、层序),以及计算树的叶子树和树的深度
用二叉搜索树实现统计一个文件中单词的个数
统计C程序单词的个数 ——Hash技术 数据结构”是计算机程序设计的重要理论技术基础,本次数据结构课程设计的内容主要是考察数据结构中的查找,查找是数据结构中很重要的一章,其实在日常生活中我们,我们几乎每天都...
void dfs(linkmap *maps,int i)//i用来指定深度优先遍历的起始值 { edgenode *pp; printf("%c",maps->maplist[i].element); v[i]=1; pp=maps->maplist[i].firstedge; while(pp) { if(!v[pp->adress]) ...
有了单词列表,我们可以开始统计每个单词的出现次数。这里可以使用字典(dictionary)数据结构,其中键是单词,值是对应的计数。遍历单词列表,对每遇到的单词,如果它不在字典中,则添加为新键并设置计数为1;如果...
二叉树的建立、遍历、叶子结点树、深度 二叉树是一种基本的数据结构,它广泛应用于计算机科学和信息技术领域。二叉树的建立、遍历、叶子结点树、深度等操作是二叉树的基本操作。本文将对二叉树的建立、遍历、叶子...
/*建立二叉树后写出各种遍历算法,统计各类结点个数并求树的深度 (1)仅输出中序遍历第K个元素算法(奖励1分) (2)编写求某个结点在树中层数算法(奖励2分) (3)已知中序和后序建立树结构(奖励3分)*/
//num 用来统计单词的个数 //state 用来记录程序当前是否处于一个单词之中,初值为0,表示不在单词中,值为1,表示正处于在一个单词中 printf("Please input the number of lines for English passage:"); scanf...
该资源可以简单计算文本中单词个数