数据结构与算法分析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
原创粉丝点击