`
frank-liu
  • 浏览: 1682394 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Word Search

 
阅读更多

问题描述:

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

For example,
Given board =

[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.

原问题链接:https://leetcode.com/problems/word-search/

 

问题分析

  这个问题有一种典型的思路,就是深度优先遍历的办法。因为要在矩阵里查找到一个符合字符串长度的串。我们在实现的时候会考虑到遍历矩阵里的每个位置,看它是否和给定的串匹配。

  在判断匹配的过程中,我们会用一个对应的boolean[][] matrix矩阵来保存递归遍历过程中访问过的元素。所以在碰到一个当前元素和字符串当前位置元素相等的情况下,我们就要将对应位置的matrix[i][j] 为设置为true。然后再去看它周围的4个点。这几个点中间符合条件的元素必须满足它们即在这个矩阵里,而且又没有被访问过。而这个递归调用的函数如果能够返回,则说明当前访问到的元素位置已经到达了给定串的长度。

  代码里还有一个细节就是,每次遍历完一个点之后,如果它所访问过的路径并不匹配,则需要将访问过的当前元素位置重置回来。这里是一个非常容易出错的地方。

详细的代码实现如下:

 

public class Solution {
    public boolean exist(char[][] board, String word) {
        if(board == null || word == null || word.isEmpty()) return false;
        int m = board.length, n = board[0].length;
        boolean[][] accessed = new boolean[m][n];
        for(int i = 0; i < m; i++) 
            for(int j = 0; j < n; j++) 
                if(dfs(board, word, 0, i, j, accessed)) return true;
        return false;
    }
    
    private boolean inBoard(int i, int j, char[][] board) {
        if(i < 0 || i >= board.length || j < 0 || j >= board[0].length)
            return false;
        return true;
    }
    
    private boolean dfs(char[][] board, String word, int cur, int i, int j, boolean[][] matrix) {
        if(cur == word.length()) return true;
        if(inBoard(i, j, board)) {
            if(board[i][j] == word.charAt(cur) && !matrix[i][j]) {
                matrix[i][j] = true;
                if(dfs(board, word, cur + 1, i + 1, j, matrix)) return true;
                else if(dfs(board, word, cur + 1, i - 1, j, matrix)) return true;
                else if(dfs(board, word, cur + 1, i, j + 1, matrix)) return true;
                else if(dfs(board, word, cur + 1, i, j - 1, matrix)) return true;
                matrix[i][j] = false;
                return false;
            }
        }
        return false;
    }
}

 

 

分享到:
评论

相关推荐

    leetcode答案-exercise-book:算法练习记录

    Search 解决方法:DFS LeetCode: 31. Next Permutation 解决方法:掌握排列组合的字典序规律,即可。这个规律找不到,我最后还是直接看答案的。 LeetCode: 581. Shortest Unsorted Continuous Subarray 解决方法:无...

    hihocoder和leetcode-leetcode:leetcode

    hihocoder和leetcode leetcode 目录名 功能 Array 数组 Backtracking 回溯 Bit_Manipulation 位操作 Design 数据结构设计 ...单词搜索:word_search.cpp hihocoder String 文章重排:give_my_text_back.cpp

    leetcode答案-leetcode:leetcode

    Search)+ 鸽笼原理(Pigeonhole Principle) “不允许修改数组” 与 “常数空间复杂度”这两个限制条件意味着:禁止排序,并且不能使用Map等数据结构 小于O(n2)的运行时间复杂度可以联想到使用二分将其中的一个n...

    LeetCode:关于LeetCode.com和ACM的一些算法问题

    LeetCode一些 LeetCode 题目的进阶解法,追求极致效率。由于 LeetCode 已启用中文版域名 leetcode-... Word-Search-II题目: | 英文站源码:./problem-0212-Word-Search-II/标签:哈希表,双向链表难度:困难 / Hard

    lrucacheleetcode-leetcode:算法实践

    lru缓存leetcode ...数据结构设计https://leetcode.com/problems/add-and-search-word-data-structure-design/ 硬字搜索IIhttps://leetcode.com/problems/word-search-ii/ EasyFind the Difference ...

    leetcode寻找最近的-leetcode:leetcode题目

    search_word79.cpp。 链表基本操作要进行删除元素,那么在循环的过程中尽量使用前驱进行循环。提前校验head,head-&gt;next。new一个空头部。头插法pcur是空头后一位。 对于查找查找类的题目首先考虑二分查找,但是二分...

    leetcode分类-leetcode:leetcode刷题

    1. **字符串匹配**:如“单词搜索”(Word Search),需要在一个二维字符网格中查找给定单词。 2. **字符串反转与替换**:如“反转字符串”(Reverse String)和“替换空格”(Replace Spaces)。 3. **字符串哈希...

    Leetcode:LeetCode 刷题总结

    6. **回溯法**:回溯法通常用于解决组合优化问题,如"八皇后问题"(N-Queens)或"单词搜索"(Word Search)。 7. **图论**:图论问题涉及节点和边的连接,如"最短路径"(Shortest Path)或"最小生成树"(Minimum ...

    leetcode338-LeetCode:力码

    单词搜索II(Word Search II)**:这是单词搜索问题的升级版,需要在一个二维字符网格中寻找多个给定单词。此题需要用到回溯法和动态规划,同时理解字符串匹配算法如KMP或Rabin-Karp。 4. **301. 删除无效的括号...

    扩展矩阵leetcode-Leetcode:LeetcodeAnswer-Java

    扩展矩阵leetcode Leetcode Leetcode Answer-Java 数组 11.乘最多水容器 ...wordBreak 279.完全平方数 numSquares 排序 56.合并区间 merge 75.颜色分类 sortColors 179.最大数 largestNumber 324.摆

    gasstationleetcode-leetcode:LeetcodeOJ解决方案

    leetcode 【演示记录】 报告 展示 2017/03/06 1.二和,167.二和二 2107/03/06 15.3 总和,16.3 总和最近,18.4 总和,11.最多水的容器 2017/03/09 62.Unique Paths, 63.Unique Paths II, 64.Minimum Path Sum 2017/...

    Daily_Leetcode:每天一个Leetcode问题

    问题235:“最近的公共祖先(Lowest Common Ancestor of a Binary Search Tree)” 这是一个关于二叉搜索树的问题。在二叉搜索树中,每个节点的值都大于其左子树中的所有节点值,小于其右子树中的所有节点值。这个问题...

    word源码java-Awesome-leetcode:leetcode问题的解决方法,包括python和java代码

    word源码java awesome-leetcode 用Java或者python实现的leetcode代码, java相关代码主要来源于 大佬,特此说明,感谢大佬的整理, 我只是为了方便继续写我的python代码,重新更改了许多文件。 Easy # Title Tag 1 ...

    lrucacheleetcode-python-leetcode:Pythonleetcode

    3. "Add and Search Word - Data structure design"(添加和搜索单词 - 数据结构设计):这个问题涉及构建一个字典树,并结合LRU缓存进行搜索优化。 在"python-leetcode-master"这个压缩包中,很可能包含了一个或多...

    leetcode力扣是什么-leetcode:leetcodebytags按自己整理的一些类别

    leetcode力扣是什么 leetcode-按类别 看了一些leetcode刷题指南,总结一下两个重点,一是最好按照类别刷题,总结思路;二是由易到难,不要产生太大挫败感。...Search II (hard) DFS /二叉树 the difference between df

    python-leetcode题解之079-Word-Search

    python python_leetcode题解之079_Word_Search

    c语言-leetcode题解之0079-word-search.zip

    c c语言_leetcode题解之0079_word_search.zip

    LeetCode最全代码

    318| [Maximum Product of Word Lengths](https://leetcode.com/problems/maximum-product-of-word-lengths/) | [C++](./C++/maximum-product-of-word-lengths.cpp) [Python](./Python/maximum-product-of-word-...

    js-leetcode题解之79-word-search.js

    javascript js_leetcode题解之79-word-search.js

    LeetCode题解(java语言实现).pdf

    LeetCode题解(java语言实现) 本资源提供了LeetCode题解的Java语言实现,涵盖了多种算法和数据结构,包括数组、链表、树、图、动态规划、贪心算法等。该资源共包含71个LeetCode题解,涵盖了多个难度级别的题目,...

Global site tag (gtag.js) - Google Analytics