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

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. 匿名委托(方法) 以 ThreadStart 为例

    Hello Tec.   匿名委托(方法) 以 ThreadStart 为例 REF:http://baike.baidu.com/view/2761370.htm?fr=aladdin   不使用匿 ...

  2. <富爸爸,穷爸爸> 书中的好句子

    成为 做 拥有 资产是能把钱放进你口袋里的东西:负债是把钱从你的口袋里取走的东西. 语言会变成血肉,留在我们的身体里 要想做一个成功的投资者,你必须在情感上对赚钱和赔钱漠不关心,赚钱和赔钱只是游戏的一 ...

  3. (PHP)redis Hash(哈希)操作

    /** * * Hash操作 * 哈希操作 * 可理解为数据库操作 * */ //为user表中的字段赋值.成功返回1,失败返回0.若user表不存在会先创建表再赋值,若字段已存在会覆盖旧值. $re ...

  4. PostFX v2后期处理特效包:升级更惊艳的视觉效果

    https://mp.weixin.qq.com/s/BMkLLuagbhRSWspzeGhK7g Post-Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊 ...

  5. poj 1655 Balancing Act(找树的重心)

    Balancing Act POJ - 1655 题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的. /* 找树的重心可以用树形dp或 ...

  6. web版聊天框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. thinkphp实现登录后返回原界面

    主要思路还是用session记录原地址,在登录后再跳转回原界面 先保存请求login方法界面的url public function savelogin(){ session('returnUrl', ...

  8. java怎样防止内存溢出

    引起内存溢出的原因有很多种,小编列举一下常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据:2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收:3.代码中存在死 ...

  9. 牛客练习赛43D(贪心)

    有生之年我居然也能不看题解做出来题QAQ-- 发现c.d是0.1序列而不是随机数列说明有蹊跷,于是发现负数直接配0,正数配1即可.不知道哪个最小,那就全求一下吧--我的做法的坑点是数正好为1时不可以选 ...

  10. LL_01

    http://www.52pojie.cn/thread-262602-1-1.html C http://www.92jh.cn/forum.php?mod=viewthread&tid=1 ...