Leetcode--Java--212. 单词搜索 II
生活随笔
收集整理的這篇文章主要介紹了
Leetcode--Java--212. 单词搜索 II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
給定一個 m x n 二維字符網格 board 和一個單詞(字符串)列表 words,找出所有同時在二維網格和字典中出現的單詞。
單詞必須按照字母順序,通過 相鄰的單元格 內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母在一個單詞中不允許被重復使用。
樣例描述
思路
Tire樹 + 哈希表
代碼
class Solution {//構造結點class TreeNode{String s; //記錄當前結尾字符為sTreeNode tns[] = new TreeNode[26];} TreeNode root = new TreeNode(); //根結點//實現Trie插入單詞public void insert(String word) {TreeNode p = root;for (char c: word.toCharArray()) {int u = c - 'a';if (p.tns[u] == null) {p.tns[u] = new TreeNode();} p = p.tns[u];}p.s = word;} //標記走過的boolean[][] vis = new boolean[15][15];//哈希表去重Set<String> set = new HashSet<>();public List<String> findWords(char[][] board, String[] words) {int m = board.length, n = board[0].length;//構造Trie樹for (String s: words) {insert(s);}//枚舉起點for (int i = 0; i < m; i ++ ) {for (int j = 0; j < n; j ++ ) {int u = board[i][j] - 'a';//要有該起點在Trie上有分支才進行枚舉if (root.tns[u] != null ) {vis[i][j] = true; //標記走過dfs(board, i, j, root.tns[u]);vis[i][j] = false;}}}List<String> res = new ArrayList<>();for (String word: set) {res.add(word);}return res;}public void dfs(char[][] board, int i, int j, TreeNode p) {//當前字符已經是結尾那個,就裝入結果集if (p.s != null) set.add(p.s);int dx[] = new int[]{0, 1, 0, -1};int dy[] = new int[]{1, 0, -1 ,0};//枚舉四個方向 for (int d = 0; d < 4; d ++ ) {int a = i + dx[d], b = j + dy[d];if (a < 0 || b < 0 || a >= board.length || b >= board[0].length || vis[a][b] == true) continue;int u = board[a][b] - 'a';//只有在Trie上存在分支,才往下走if (p.tns[u] != null) {vis[a][b] = true;dfs(board, a, b, p.tns[u]);vis[a][b] = false;}}} }總結
以上是生活随笔為你收集整理的Leetcode--Java--212. 单词搜索 II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 概率论-泊松分布
- 下一篇: 按计算机应用领域分类,按计算机用途分类