博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
212. Word Search II
阅读量:5147 次
发布时间:2019-06-13

本文共 2997 字,大约阅读时间需要 9 分钟。

原题链接:

这道题目也是在看完 LeetCode 上实现前缀树的文章后推荐的练习题。这道题目初看毫无思路,官方也并未提供解答,还是只能看评论区别人提交的答案了。然后评分最高的就是使用前缀树+回溯法(Backtracking)来解决了:

import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * Created by clearbug on 2018/2/26. */public class Solution {    class TrieNode {        TrieNode[] next = new TrieNode[26];        String word;        char c;        @Override        public String toString() {            return "[c is: " + c + ", word is: " + word + "]";        }    }    public TrieNode buildTrie(String[] words) {        TrieNode root = new TrieNode();        for (String w : words) {            TrieNode p = root;            for (char c : w.toCharArray()) {                int i = c - 'a';                if (p.next[i] == null) {                    p.next[i] = new TrieNode();                    p.next[i].c = c;                }                p = p.next[i];            }            p.word = w;        }        return root;    }    public static void main(String[] args) {        char[][] board = {                {'o', 'a', 'a', 'n'},                {'e', 't', 'a', 'e'},                {'i', 'h', 'k', 'r'},                {'i', 'f', 'l', 'v'}        };        String[] words = {"oath", "pea", "eat", "rain"};        Solution s = new Solution();        System.out.println(s.findWords(board, words));;    }    public List
findWords(char[][] board, String[] words) { List
res = new ArrayList<>(); TrieNode root = buildTrie(words); for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { dfs (board, i, j, root, res); } } return res; } public void dfs(char[][] board, int i, int j, TrieNode p, List
res) {// print(board, i, j, p, res); char c = board[i][j]; if (c == '#' || p.next[c - 'a'] == null) return; p = p.next[c - 'a']; if (p.word != null) { // found one res.add(p.word); p.word = null; // de-duplicate } board[i][j] = '#'; if (i > 0) dfs(board, i - 1, j ,p, res); if (j > 0) dfs(board, i, j - 1, p, res); if (i < board.length - 1) dfs(board, i + 1, j, p, res); if (j < board[0].length - 1) dfs(board, i, j + 1, p, res); board[i][j] = c; } public void print(char[][] board, int i, int j, TrieNode p, List
res) { System.out.println("===================================================="); System.out.println("board is: "); for (int k = 0; k < board[0].length; k++) { System.out.println(Arrays.toString(board[k])); } System.out.println("i is: " + i + ", j is: " + j); System.out.println("p is: " + p); System.out.println("res is: " + res); System.out.println("===================================================="); }}

回溯法有点绕,所以看解答时不能死扣细节,而是看完代码后在脑子中形成大致思路!

转载于:https://www.cnblogs.com/optor/p/8521681.html

你可能感兴趣的文章
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
财务结算的目的和一般流程
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
老李分享:5个衡量软件质量的标准
查看>>
Xcode部分插件无法使用识别的问题
查看>>
set学习记录
查看>>
用函数写注册功能
查看>>
JVM笔记4:Java内存分配策略
查看>>
IE8 window.open 不支持此接口 的问题解决
查看>>
Django -- 发送HTML格式的邮件
查看>>
最近面试问题汇总
查看>>
ORM版学员管理系统3
查看>>
修改安卓虚拟机系统镜像
查看>>
windows 2003 Server平台Delphi程序不支持直接调用webservice
查看>>
电子书下载:Professional ASP.NET Design Patterns
查看>>
random 产生一个随机数的方法
查看>>
RST_n的问题
查看>>
欢迎来我的#百度相册#时光轴,坐上时光机,与我一起穿梭时空!
查看>>