这次的作业主要用到了单词查找树和深度优先搜索。

1.在深度优先搜索中,在当前层的递归调用前,将marked数组标记为true。当递归调用返回到当前层时,应将marked数组标记为false。这样既可以使访问完当前节点之后不会访问到达当前节点路径上的节点,又可以从其它路径上访问到该节点。

2.当词典中没有单词以到达当前节点后的字符串为前缀时,即可停止深度优先搜索。

3.重写单词查找树,R为26,避免消耗过多的空间。另外keysWithPrefix函数改为hasKeysWithPrefix函数,因为不需要查找以某一字符串为前缀的所有单词,而只需判断是否有以某一字符串为前缀的单词。

 import java.util.HashSet;
import java.util.Set; public class BoggleSolver
{
private TrieSET2 dictionary = new TrieSET2(); public BoggleSolver(String[] dictionary)
{
for (String s : dictionary)
this.dictionary.put(s);
}
private int m, n;
public Iterable<String> getAllValidWords(BoggleBoard board)
{
Set<String> set = new HashSet<String>();
m = board.rows();
n = board.cols();
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
marked = new boolean[m][n];
dfs (set, board, i, j, "");
}
}
return set;
}
private boolean[][] marked;
private boolean isMarked(int i, int j)
{
if (i < 0 || i >= m || j < 0 || j >= n)
return true;
return marked[i][j];
}
private void dfs(Set<String> set, BoggleBoard board, int i, int j, String s)
{
char c = board.getLetter(i, j);
if (c == 'Q') s += "QU";
else s += c;
if (!dictionary.hasKeysWithPrefix(s)) return;
marked[i][j] = true;
if (s.length() > 2 && dictionary.contains(s))
set.add(s);
for (int k = -1; k < 2; k++)
{
for (int l = -1; l < 2; l++)
{
if (!isMarked(i + k, j + l))
dfs(set, board, i + k, j + l, s);
}
}
marked[i][j] = false;
} public int scoreOf(String word)
{
if (!dictionary.contains(word))
return 0;
int length = word.length();
if (length < 3) return 0;
else if (length < 5) return 1;
else if (length == 5) return 2;
else if (length == 6) return 3;
else if (length == 7) return 5;
else return 11;
}
}
 import edu.princeton.cs.algs4.Queue;

 public class TrieSET2
{
private static int R = 26;
private Node root; private static class Node
{
private boolean hasWord;
private Node[] next = new Node[R];
} public void put(String key)
{
root = put(root, key, 0);
} private int charAt(String s, int d)
{
return s.charAt(d) - 'A';
} private Node put(Node x, String key, int d)
{
if (x == null) x = new Node();
if (d == key.length())
{
x.hasWord = true;
return x;
}
int c = charAt(key, d);
x.next[c] = put(x.next[c], key, d+1);
return x;
} public boolean contains(String key)
{
Node x = get(root, key, 0);
if (x == null) return false;
return x.hasWord;
} private Node get(Node x, String key, int d)
{
if (x == null) return null;
if (d == key.length()) return x;
int c = charAt(key, d);
return get(x.next[c], key, d+1);
} public boolean hasKeysWithPrefix(String pre)
{
return get(root, pre, 0) != null;
}
}

Coursera 算法二 week 4 Boggle的更多相关文章

  1. Coursera 算法二 week2 Seam Carving

    这周作业设计到的算法是有向无环图的最短路径算法,只需要按照顶点的拓扑顺序去放松顶点即可.而在这个题目中拓扑顺序就是按照行的顺序或列的顺序. 用到的数据结构为一个二维数组picture同来存储每个像素的 ...

  2. Coursera 算法二 week 5 BurrowsWheeler

    本打算周末完成这次作业,但没想到遇到了hard deadline,刚开始看不懂题意,后来发现算法4书上有个类似的问题,才理解了题意.最后晚上加班,上课加班,还好在11:35也就是课程结束前25分钟完成 ...

  3. Coursera 算法二 week 3 Baseball Elimination

    这周的作业不需要自己写算法,只需要调用库函数就行,但是有些难以理解,因此用了不少时间. import edu.princeton.cs.algs4.FlowEdge; import edu.princ ...

  4. coursera 算法二 week 1 wordnet

    这周的作业可谓是一波三折,但是收获了不少,熟悉了广度优先搜索还有符号图的建立.此外还知道了Integer.MAX_VALUE. SAP: 求v和w的大概思路是对v和w分别广度优先搜索,然后遍历图中每一 ...

  5. TensorFlow 入门之手写识别(MNIST) softmax算法 二

    TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  6. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  7. Floyd算法(二)之 C++详解

    本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...

  8. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  9. Prim算法(二)之 C++详解

    本章是普里姆算法的C++实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http://www.cnblogs.com/sk ...

随机推荐

  1. Note: Bimodal Content Defined Chunking for Backup Streams

    CDC算法给出了一个chunk的大小的最小值.最大值.平均值的界定. Method Using chunk existence information breaking-apart algorithm ...

  2. 清橙 A1210. 光棱坦克

    A1210. 光棱坦克 时间限制:1.0s   内存限制:512.0MB   总提交次数:   AC次数:   平均分:   将本题分享到:        查看未格式化的试题   提交   试题讨论 ...

  3. 遍历json字符串 并 写入对应的文本框

    1.js代码: function getFlws(){ var url = urlpath + "bhjk/getJson2.sd?"; $.post(url,function(d ...

  4. 消息中间件的研究 (四)RabbitMQ、Kafka、RocketMQ消息中间件的对比及分析

    RabbitMQ:     RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现.AMQP的主要特征是面向消息.队列.路由(包括点对点和发布/订阅).可靠性.安全.AM ...

  5. Oracle中慎用Like等通配符

    Like关键字,从技术上来说,是一个非常友善的通配符.利用这个通配符,我们可以实现很多模糊查询.如现在在一个人事档案系统中,用户想知道身份证号码以“339005”开头的人事信息,此时,就可以利用Lik ...

  6. LeetCode初级算法(数组)解答

    这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...

  7. spring /* 和 /** 的 区别。

    例如 /** 拦截 /index/1   和  /index /* 代表 /index/1 而  /index 则不会被拦截

  8. python大战机器学习——半监督学习

    半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数.它是一类可以自动地利用未标记的数据来提升学习性能的算法 1.生成式半监督学习 优点:方法简单,容易实现.通常在有标记数据极少时, ...

  9. 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC

    题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...

  10. JVM垃圾收集器总结

    前言: 了解了JVM垃圾回收算法之后就要说说垃圾收集器了. 一.三个概念 Stop-the-World:JVM执行任何一种GC算法时是会停止应用程序的执行的,所以大多数GC优化都是从减少Stop-th ...