zoukankan      html  css  js  c++  java
  • 212. Word Search II

        /*
         *212. Word Search II 
         *2016-6-11 by Mingyang
         *这真的是我见过最好玩的题目了,在已经有了Trie的基础上,我们再继续往下看
         *直接利用这个工具,每次都传进去,这样后面就可以不断的使用这个工具
         *然后首先的思路就是把Trie填满需要的东西
         *然后就是对每一个位置进行dfs。记住要使用visit map来进行定位
         */
        public List<String> findWords(char[][] board, String[] words) {
            HashSet<String> list = new HashSet();
            Tries trie = new Tries();
            for (String word : words)
                trie.insert(word);
            boolean[][] visited = new boolean[board.length][board[0].length];
            for (int i = 0; i < board.length; i++)
                for (int j = 0; j < board[0].length; j++)
                    dfss(list, board, visited, "", i, j, trie);
            return new ArrayList(list);
        }
        public void dfss(Set<String> list, char[][] board, boolean[][] visited,
                String str, int x, int y, Tries trie) {
            if (x < 0 || x >= board.length || y < 0 || y >= board[0].length)
                return;
            if (visited[x][y])
                return;
            str += board[x][y];
            if (!trie.startsWith(str))
                return;
            if (trie.search(str))
                list.add(str);
            visited[x][y] = true;
            dfss(list, board, visited, str, x - 1, y, trie);
            dfss(list, board, visited, str, x + 1, y, trie);
            dfss(list, board, visited, str, x, y - 1, trie);
            dfss(list, board, visited, str, x, y + 1, trie);
            visited[x][y] = false;
        }
    }
    class Tries {
        public TrieNode root;
        public Tries() {
            root = new TrieNode();
            root.isEnd = true;
        }
        public void insert(String word) {
            if (word == null || word.length() == 0)
                return;
            TrieNode node = root;
            char[] letters = word.toCharArray();
            for (int i = 0; i < word.length(); i++) {
                int pos = letters[i] - 'a';
                if (node.son[pos] == null) {
                    node.son[pos] = new TrieNode();
                    node.son[pos].val = letters[i];
                }
                node = node.son[pos];
            }
            node.isEnd = true;
        }
        // Returns if the word is in the trie.
        public boolean search(String word) {
            if (word == null || word.length() == 0) {
                return false;
            }
            TrieNode node = root;
            char[] letters = word.toCharArray();
            for (int i = 0; i < word.length(); i++) {
                int pos = letters[i] - 'a';
                if (node.son[pos] != null) {
                    node = node.son[pos];
                } else {
                    return false;
                }
            }
            return node.isEnd;
        }
        // Returns if there is any word in the trie
        // that starts with the given prefix.
        public boolean startsWith(String prefix) {
            if (prefix == null || prefix.length() == 0) {
                return false;
            }
            TrieNode node = root;
            char[] letters = prefix.toCharArray();
            for (int i = 0; i < prefix.length(); i++) {
                int pos = letters[i] - 'a';
                if (node.son[pos] != null) {
                    node = node.son[pos];
                } else {
                    return false;
                }
            }
            return true;
        }
    }
    class TrieNode {
        // Initialize your data structure here.
        TrieNode[] son;// 所有的儿子节点
        boolean isEnd;// 是不是最后一个节点
        char val;// 节点的值
        TrieNode() {
            this.son = new TrieNode[26];
            this.isEnd = false;
        }
    }
  • 相关阅读:
    AngularJS 国际化——Angular-translate
    Elasticsearch Span Query跨度查询
    Elasticsearch 连接查询
    Elasticsearch DSL中Query与Filter的不同
    Lucene查询语法详解
    Elasticsearch 文件目录解释
    Elasticsearch 安装与启动
    《大屏可视化数据》该怎么设计?
    两个大屏可视化案例的布局与实现
    maven 安装后变成 mvn 不是内部命令解决方法
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5576344.html
Copyright © 2011-2022 走看看