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

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

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

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

 1 import java.util.HashSet;
 2 import java.util.Set;
 3
 4 public class BoggleSolver
 5 {
 6     private TrieSET2 dictionary = new TrieSET2();
 7
 8     public BoggleSolver(String[] dictionary)
 9     {
10         for (String s : dictionary)
11             this.dictionary.put(s);
12     }
13     private int m, n;
14     public Iterable<String> getAllValidWords(BoggleBoard board)
15     {
16         Set<String> set = new HashSet<String>();
17         m = board.rows();
18         n = board.cols();
19         for (int i = 0; i < m; i++)
20         {
21             for (int j = 0; j < n; j++)
22             {
23                 marked = new boolean[m][n];
24                 dfs (set, board, i, j, "");
25             }
26         }
27         return set;
28     }
29     private boolean[][] marked;
30     private boolean isMarked(int i, int j)
31     {
32         if (i < 0 || i >= m || j < 0 || j >= n)
33             return true;
34         return marked[i][j];
35     }
36     private void dfs(Set<String> set, BoggleBoard board, int i, int j, String s)
37     {
38         char c = board.getLetter(i, j);
39         if (c == 'Q') s += "QU";
40         else s += c;
41         if (!dictionary.hasKeysWithPrefix(s)) return;
42         marked[i][j] = true;
43         if (s.length() > 2 && dictionary.contains(s))
44             set.add(s);
45         for (int k = -1; k < 2; k++)
46         {
47             for (int l = -1; l < 2; l++)
48             {
49                 if (!isMarked(i + k, j + l))
50                     dfs(set, board, i + k, j + l, s);
51             }
52         }
53         marked[i][j] = false;
54     }
55
56     public int scoreOf(String word)
57     {
58         if (!dictionary.contains(word))
59             return 0;
60         int length = word.length();
61         if (length < 3) return 0;
62         else if (length < 5) return 1;
63         else if (length == 5) return 2;
64         else if (length == 6) return 3;
65         else if (length == 7) return 5;
66         else return 11;
67     }
68 }

 1 import edu.princeton.cs.algs4.Queue;
 2
 3 public class TrieSET2
 4 {
 5     private static int R = 26;
 6     private Node root;
 7
 8     private static class Node
 9     {
10         private boolean hasWord;
11         private Node[] next = new Node[R];
12     }
13
14     public void put(String key)
15     {
16         root = put(root, key, 0);
17     }
18
19     private int charAt(String s, int d)
20     {
21         return s.charAt(d) - 'A';
22     }
23
24     private Node put(Node x, String key, int d)
25     {
26         if (x == null) x = new Node();
27         if (d == key.length())
28         {
29             x.hasWord = true;
30             return x;
31         }
32         int c = charAt(key, d);
33         x.next[c] = put(x.next[c], key, d+1);
34         return x;
35     }
36
37     public boolean contains(String key)
38     {
39         Node x = get(root, key, 0);
40         if (x == null) return false;
41         return x.hasWord;
42     }
43
44     private Node get(Node x, String key, int d)
45     {
46         if (x == null) return null;
47         if (d == key.length()) return x;
48         int c = charAt(key, d);
49         return get(x.next[c], key, d+1);
50     }
51
52     public boolean hasKeysWithPrefix(String pre)
53     {
54         return get(root, pre, 0) != null;
55     }
56 }

转载于:https://www.cnblogs.com/lxc1910/p/8570921.html

Coursera 算法二 week 4 Boggle相关推荐

  1. 使用pytorch从零开始实现YOLO-V3目标检测算法 (二)

    原文:https://blog.csdn.net/u011520516/article/details/80212960 博客翻译 这是从零开始实现YOLO v3检测器的教程的第2部分.在上一节中,我 ...

  2. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  3. Unicode双向算法详解(bidi算法)(二)

    作者:黄邦勇帅(原名:黄勇)2019-10-17 Unicode双向算法详解(bidi算法)(二) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C+ ...

  4. 票据ticket实现方式java代码_Java代码实践12306售票算法(二)

    周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...

  5. matlab算法(二维傅立叶级数变换)

    说明 Y = fft2(X) 使用快速傅里叶变换算法返回矩阵的二维傅里叶变换,这等同于计算 fft(fft(X).').'.如果 X 是一个多维数组,fft2 将采用高于 2 的每个维度的二维变换.输 ...

  6. 数据结构和算法之五:排序算法二

    数据结构基础之排序算法二 学习算法,排序算法当然是不能少的,这次我们来学习一下基础的选择排序,冒泡排序,以及大名鼎鼎的快速排序. 选择排序 选择排序,非常好理解,就是找最小的数放到第一位,然后从第二个 ...

  7. 售票java代码_Java代码实践12306售票算法(二)

    周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...

  8. java按顺序售票方法_java_Java代码实践12306售票算法(二),周五闲来无事,基于上一篇关 - phpStudy...

    Java代码实践12306售票算法(二) 周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1 ...

  9. 数据结构与算法:二叉搜索树

    ✨数据结构与算法:二叉搜索树

最新文章

  1. django Table doesn't exist
  2. 【学术相关】发表 SCI 论文有哪些实用工具?
  3. 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
  4. 转载大神的一篇文章----【如何选择开源许可证?】
  5. 数据科学 IPython 笔记本 7.14 处理时间序列
  6. 【网络编程】Socket网络编程基础
  7. vb调用c语言程序,用VB编写程序,求S=A!+B!+C!,阶乘的计算分别用Sub过程和Function过程两种方法来实现...
  8. 数据结构——图的应用
  9. P5200 Sleepy Cow Sorting(树状数组,模拟)
  10. app抓包工具_抓包助手app下载安装_抓包助手软件最新版免费下载
  11. 【Matplotlib】学术论文黑白柱状图绘制
  12. 微商城如何借势618微信营销?5分钟完成活动策划案
  13. html代码中title什么意思,html中title啥意思
  14. linux系统可以使用ppt功能不,linux操作系统使用.ppt
  15. 大连理工大学计算机考研资料汇总
  16. 如何使用Erdas制作三维地图
  17. PHP Imagick添加文字水印
  18. 俯卧撑:身体状况晴雨表
  19. linux 指令学习(持续更新)
  20. Java面试宝典,怎样用cmd运行java文件

热门文章

  1. 30个最讨人喜欢的英语赞美语句
  2. 极限思想在计算机中的应用,数学极限思想的应用论文(共2篇)
  3. 此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用。 了解详情
  4. 微信小程序登录获取手机号获取不到偶发性问题
  5. 解决:java.lang.IllegalStateExceptio:Underflow in restore - more restores than saves异常,Module闪退
  6. ddrk(ddrk)
  7. 如何写出一份优秀的简历和求职信?
  8. 用dw 删除重复html文件,Dreamweaver怎么撤销重做,DW怎么返回上一步,看完就明白了...
  9. Intel汇编-无符号整数除法
  10. 解决(Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:ins)