数据结构与算法分析Java版第1章练习1.2
来源:互联网 发布:淘宝相似图片搜索 编辑:程序博客网 时间:2024/06/07 04:11
package ch01;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.List;import java.util.Scanner;import java.util.Set;import java.util.TreeSet;/** * 练习1.2 编写一个程序求解字谜游戏问题。 * 本人经过查找资料,觉得使用Trie树,又叫字典树来进行匹配查找会比较好 * 参考网址:http://blog.csdn.net/arhaiyun/article/details/11913501 * */class TrieNode {char value;TrieNode[] branches;TrieNode(char v) {value = v;branches = null;}void addBranchNode(char v) {if (branches == null) {branches = new TrieNode[27];}if (v == '$') {branches[26] = new TrieNode(v);} else {branches[v - 'a'] = new TrieNode(v);}}TrieNode getBranchNode(char v) {if (branches == null) {return null;}if (v == '$') {return branches[26];} else {return branches[v - 'a'];}}boolean isValidEnd() {if (branches != null && branches[26] != null) {return branches[26].value == '$';} return false;}}class TrieTree {TrieNode root = new TrieNode('\0');public void insert(String word) {TrieNode curNode = root;word += '$';char[] chars = word.toLowerCase().toCharArray();for (int i = 0; i < chars.length; ++i) {TrieNode branchNode = curNode.getBranchNode(chars[i]);if (branchNode == null) {curNode.addBranchNode(chars[i]);}curNode = curNode.getBranchNode(chars[i]);}}public boolean isMatch(String word) {TrieNode curNode = root;char[] chars = word.toLowerCase().toCharArray();for (int i = 0; i < chars.length; ++i) {TrieNode branchNode = curNode.getBranchNode(chars[i]);if (branchNode == null) {return false;}curNode = branchNode;}if (curNode.isValidEnd()) {return true;}return false;}}public class EX02 {static TrieTree tree = new TrieTree();public static void main(String[] args) {//读取单词表,这个单词表是从linux上的/usr/share/dict/words中取得的,这包括了//所有的英语单词.其中纯英文字母的单词大约有8万左右。Scanner scanner = null;try {scanner = new Scanner(new FileInputStream("words"));String word;while (scanner.hasNext()) {word = scanner.next();//只添加纯英文字母单词if (word.matches("[a-z]+")) {tree.insert(word);}}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();return;}if (scanner != null) {scanner.close();}System.out.println(tree.isMatch("what"));System.out.println(tree.isMatch("whath"));System.out.println(tree.isMatch("package"));// 经过上面的测试,可以看到我们成功地构建了Trie树,那么再进行前面的字谜游戏。char[][] chars = new char[][] {{'t', 'h', 'i', 's'},{'w', 'a', 't', 's'},{'o', 'a', 'h', 'g'},{'f', 'g', 'd', 't'},};Set<String> result = new TreeSet<String>();//查找行int N = chars.length;for (int i = 0; i < N; ++i) {StringBuilder builder = new StringBuilder();for (int j = 0; j < N; ++j) {builder.append(chars[i][j]);}result.addAll(findWord(builder.toString()));result.addAll(findWord(builder.reverse().toString()));}//查找列for (int i = 0; i < N; ++i) {StringBuilder builder = new StringBuilder();for (int j = 0; j < N; ++j) {builder.append(chars[j][i]);}result.addAll(findWord(builder.toString()));result.addAll(findWord(builder.reverse().toString()));}//查找正对角线StringBuilder builder = new StringBuilder();for (int i = 0; i < N; ++i) {builder.append(chars[i][i]);}result.addAll(findWord(builder.toString()));result.addAll(findWord(builder.reverse().toString()));//查找斜对角线builder = new StringBuilder();for (int i = 0; i < N; ++i) {builder.append(chars[i][N - 1 - i]);}result.addAll(findWord(builder.toString()));result.addAll(findWord(builder.reverse().toString()));//输出结果, 输出结果为 ah at d f fats g h hat his i is o of s t that this ti ts w //不用奇怪,因为这些都是单词表里词,如果你把文件words添加一些自己的单词,//则结果就只会显示你添加的单词for (String word : result) {System.out.print(word+" ");}System.out.println();}private static Set<String> findWord(String inputLine) {//System.out.println("findWord: " + inputLine);Set<String> result = new TreeSet<String>();for (int i = 0; i < inputLine.length(); ++i) {if (tree.isMatch(inputLine.substring(i))) {result.add(inputLine.substring(i));//break;//只找最长的单词}}return result;}}words文件地址为:http://download.csdn.net/detail/zhangyingli/9056959
0 0
- 数据结构与算法分析Java版第1章练习1.2
- 数据结构与算法分析Java版第1章练习1.1
- 数据结构与算法分析Java版练习1.3
- 数据结构与算法分析Java版练习1.5
- 数据结构与算法分析Java版练习1.6
- 数据结构与算法分析Java版练习1.7
- 数据结构与算法分析Java版练习1.8
- 数据结构与算法分析Java版练习1.11和1.12
- 数据结构与算法分析Java版练习1.13
- 数据结构与算法分析Java版练习1.14
- 数据结构与算法分析Java版练习1.15
- 数据结构与算法分析Java版练习2.1和2.2
- 数据结构与算法分析Java版练习2.8
- 数据结构与算法分析练习
- 数据结构与算法分析(第3版)练习题-第1章-引论
- 数据结构与算法练习Java版练习1.4
- 数据结构与算法练习Java版练习1.9和1.10
- 数据结构与算法分析Java版练习2.3,2.4,2.5,2.6和2.7
- 无监督学习和监督学习的用途
- Android 悬浮窗的实现源码
- noip2002 选数(深搜+质数判断)
- mybatis在xml文件中处理大于号小于号的方法
- Xcode: Auto property synthesis will not synthesize property 解决
- 数据结构与算法分析Java版第1章练习1.2
- springMVC文件上传
- 通过代码快速理解Java代码块
- 使用Thrift RPC编写程序
- Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】
- 最新关于try ,catch,throw的使用小结
- 【SDOI2009】【BZOJ1875】HH去散步
- 题目1841 Find the Shortest Common Superstring(KMP)
- LeetCode题解:Remove Duplicates from Sorted List