`
128kj
  • 浏览: 599958 次
  • 来自: ...
社区版块
存档分类
最新评论

深度优先遍历字典树(统计单词出现的个数)

阅读更多
例:给出一个字符文本,每行一个字符串,统计不同的字符串出现的百分比,最后按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();
    }
}


源码:
0
0
分享到:
评论

相关推荐

    算法面试通关手写代码40讲 .txt

    面试题:统计位1的个数.mp4 39.理论讲解:位运算.mp4 38.面试题:二维网格中的单词搜索问题.mp4 37.面试题:实现一个字典树.mp4 36.理论讲解:字典树.mp4 35.面试题:实现一个求解平方根的函数.mp4 34.理论讲解:二...

    数据结构课程设计报告

    4. **单词接龙**:这是一类字符串处理问题,可能需要使用动态规划或Trie树(字典树)来寻找一个单词序列,使得每个单词的结尾字母是下一个单词的开头字母。 5. **挖宝藏**:可能是寻找最短路径问题的变种,可以利用...

    数据结构与算法任务书总论.pdf

    14. **单词单字符置换**:可以使用哈希表或字典树来存储单词和它们的转换路径,构建从A到B的可行路径。 15. **文本编辑器**:设计一个基于链表的文本编辑器,需要实现对行的增删改查操作,以及支持各种命令处理,...

    百度C面试题-资料汇总.pdf

    然后,通过深度优先搜索或广度优先搜索找到所有的连通分量,即无交集的集合。初始步骤是对集合进行排序,以减小比较次数。这种方法的时间复杂度为O(m + n),m为集合间的交集数量,n为集合数量。优化方向可以考虑使用...

    数据结构与算法课设题目一 (2).pdf

    1. **扫雷问题**:这是一个典型的图遍历问题,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。程序需要读取输入文件,创建一个二维数组表示网格,然后通过计数相邻的雷来填充非雷格子的数值。这涉及到数组...

    数据结构与算法课设题目一1 (2).pdf

    1. **扫雷问题**:这是一个典型的图遍历问题,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。对于每个未知方块,计算其周围8个相邻方块中雷的数量,然后更新网格。这需要理解二维数组的邻接关系。 2. *...

    数据结构与算法任务书总论.docx

    14. **单词置换问题**:需要实现字符串操作,以及可能的图算法(如字典树)来检查单字符置换的可能性。 15. **文本编辑器**:涉及到链表操作和文件管理,需要实现各种编辑命令,如插入、删除、移动行,以及文件定位...

    javaWordLadder:一个用java创建的词梯

    `findLadder()` 方法是实现词梯的核心,可以采用广度优先搜索(BFS)或深度优先搜索(DFS)策略。由于词梯问题要求路径最短,BFS通常更为合适,因为它能保证找到最短路径。我们可以使用一个队列(Queue)来存储当前...

    acm 错误集

    文件提到,字典树中`tb[]`数组的大小应根据题目中单词的个数来确定。 **解决方案与注意事项:** - 在创建字典树时,首先统计单词的数量,然后根据需要为每个节点分配适当的空间。 - 考虑使用动态分配的方式,避免...

Global site tag (gtag.js) - Google Analytics