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

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. [CentOS7] Segmentation fault (core dumped),但是在主机上找不到core文件

    1.问题描述 程序执行报:Segmentation fault (core dumped),但是在主机上找不到core文件 2.如何让系统生成core file /home>ulimit -ac ...

  2. AIM Tech Round 5 (rated, Div. 1 + Div. 2) D(SET,思维)

    #include<bits/stdc++.h>using namespace std;const long long mod = 1e9+7;char s[370007][27];long ...

  3. (PHP)redis Set(集合)操作

    /** * * Set操作 * 集合命令 * 保证数据的唯一 * 不保证顺序 * */ //将一个元素加入集合,已经存在集合中的元素则忽略.若集合不存在则先创建,若key不是集合类型则返回false, ...

  4. struts2学习笔记——常见报错及解决方法汇总(持续更新)

    操作环境:(1)Tomcat 7.0.72.0 (2)OS Name: Windows 7  (3)JVM Version:  1.8.0_25-b18  (4)eclipse Version: Ke ...

  5. pb_ds的优先队列实现dijkstra

    用pb_ds的优先队列来做dijkstra..据说noip能用哟. 先来篇关于仿函数的文章. 由于pb_ds支持由迭代器访问元素,并且push操作会返回一个迭代器,merge操作会更新迭代器,相当于帮 ...

  6. MCP|ZWT|Precision de novo peptide sequencing using mirror proteases of Ac-LysargiNase and trypsin for large-scale proteomics(基于Ac-LysargiNase和胰蛋白酶的蛋白组镜像de novo测序)

    一.概述 由于难以获得100%的蛋白氨基酸序列覆盖率,蛋白组de novo测序成为了蛋白测序的难点,由Ac-LysargiNase(N端蛋白酶)和胰蛋白酶构成的镜像酶组合可以解决这个问题并具有稳定性, ...

  7. AT2657 Mole and Abandoned Mine

    传送门 好神的状压dp啊 首先考虑一个性质,删掉之后的图一定是个联通图 并且每个点最多只与保留下来的那条路径上的一个点有边相连 然后设状态:\(f[s][t]\)代表当前联通块的点的状态为\(s\)和 ...

  8. AT2160 へんなコンパス / Manhattan Compass

    传送门 乍一看像是一个计算几何,然后想到了BFS,但是苦于无奈\(O(n^2)\)不会优化 然后以下参考zjq_shadow大佬的思路 显然发现曼哈顿距离很麻烦,除了暴力枚举貌似没什么很好的办法 考虑 ...

  9. 关于String的split方法

    在做剑指offer的时候,有一道替换空格的题,立刻就想到用这个split方法来做,但发现,这个方法会丢掉字符串最后的空格??? 百度后,知道原因,这里直接复制粘贴了: 在使用java中的split按照 ...

  10. 021 Merge Two Sorted Lists 合并两个有序链表

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...