LeetCode-079-单词搜索
单词搜索
题目描述:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例说明请见LeetCode官网。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:回溯算法
首先,直接判断2种特殊场景:
- 如果要匹配的字符串为空,直接返回true;
- 如果board数组为空,直接返回false。
否则,先声明一个和board同样大小的boolean类型的数组,记录当前单元格是否已经走过,然后遍历board的每一个字符,对每一个字符和word第一个字符相等的时候,调用回溯方法进行判断以当前字符为起点是否能够匹配word字符串,如果能返回true,否则继续遍历下一个字符。最后,如果没有匹配成功,返回false。
public class LeetCode_079 {
public static boolean exist(char[][] board, String word) {
/**
* 如果要匹配的字符串为空,直接返回true
*/
if (word == null || word.length() == 0) {
return true;
}
/**
* 如果board数组为空,直接返回false
*/
if (board == null || board.length == 0 || board[0].length == 0) {
return false;
}
/**
* 声明一个和board同样大小的boolean类型的数组,记录当前单元格是否已经走过
*/
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++) {
/**
* 对每一个字符和word第一个字符相等的时候,调用方法进行判断
*/
if (board[i][j] == word.charAt(0) && exist(board, visited, word, i, j, 0)) {
return true;
}
}
}
return false;
}
/**
* 回溯算法
*
* @param board 原字符网格
* @param visited 和board大小相同的boolean类型的网格,标识当前字符是否走过
* @param word 要匹配的单词
* @param startX 当前单元格的x坐标
* @param startY 当前单元格的y坐标
* @param pos 当前已经匹配了几个字符
* @return
*/
private static boolean exist(char[][] board, boolean[][] visited, String word, int startX, int startY, int pos) {
if (board[startX][startY] != word.charAt(pos)) {
// 如果当前单元格和要匹配的字符不同,直接返回false
return false;
} else if (pos == word.length() - 1) {
// 如果已经匹配的字符数和word的长度相等,则说明已经匹配成功,返回true
return true;
}
visited[startX][startY] = true;
// 当前单元格可以往四个方向移动
int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
boolean result = false;
for (int[] dir : directions) {
int nextStartX = startX + dir[0], nextStartY = startY + dir[1];
if (nextStartX >= 0 && nextStartX < board.length && nextStartY >= 0 && nextStartY < board[0].length) {
if (!visited[nextStartX][nextStartY]) {
boolean flag = exist(board, visited, word, nextStartX, nextStartY, pos + 1);
if (flag) {
result = true;
break;
}
}
}
}
visited[startX][startY] = false;
return result;
}
public static void main(String[] args) {
char[][] board = new char[][]{{'A', 'B', 'C', 'E'}, {'S', 'F', 'C', 'S'}, {'A', 'D', 'E', 'E'}};
// 测试用例,期望返回: true
System.out.println(exist(board, "ABCCED"));
}
}
【每日寄语】 逆境、是非来临,心中要持一“宽”字。
LeetCode-079-单词搜索的更多相关文章
- [leetcode] 212. 单词搜索 II(Java)
212. 单词搜索 II 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 ...
- Leetcode 212.单词搜索II
单词搜索II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...
- Leetcode 79.单词搜索
单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...
- [LeetCode] 212. 单词搜索 II
题目链接:https://leetcode-cn.com/problems/word-search-ii/ 题目描述: 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在 ...
- Java实现 LeetCode 212 单词搜索 II(二)
212. 单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中&quo ...
- Java实现 LeetCode 79 单词搜索
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...
- 力扣算法题—079单词搜索【DFS】
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...
- LeetCode 79.单词搜索 - JavaScript
题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...
- LeetCode——79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...
- [LeetCode] 79. 单词搜索(DFS,回溯)
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
随机推荐
- Java语法专题1: 类的构造顺序
合集目录 Java语法专题1: 类的构造顺序 问题 下面的第二个问题来源于Oracle的笔试题, 非常经典的一个问题, 我从07年开始用了十几年. 看似简单, 做对的比例不到2/10. 描述一下多级继 ...
- Python 单元测试 实战演练
结合实例,联系单元测试. 文件结构: |----Python_unittest |--------math_operation.py # 定义了类[class MathOperation:],类里面定 ...
- C++函数调用过程解析
编译环境:Windows 10 + VS2015. 0.引言 函数调用的过程实际上也就是一个中断的过程,本文演示和深入分析参数入栈.函数跳转.保护现场.恢复现场等函数调用过程. 首先对三个常用的寄存器 ...
- NumPy 初学者指南中文第三版·翻译完成
原文:NumPy: Beginner's Guide - Third Edition 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅 ...
- X000101
P3879 [TJOI2010]阅读理解 考虑用 Trie 解决 #include<stdio.h> #include<bitset> #include<string.h ...
- GC基础知识
内存溢出和内存泄漏 内存溢出(Out Of Memory) 就是申请内存时,JVM没有足够的内存空间.通俗说法就是去蹲坑发现坑位满了. 内存泄露 (Memory Leak) 就是申请了内存,但是没有释 ...
- python开发: linux进程打开的文件数
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 4 ''' 统计linux打开的文件数 ''' 5 6 import os 7 import sys ...
- mysql导出csv格式命令
mysql -h 127.0.0.1 -u user -p123456 -Bse "select name,age from user where age > 10;" | ...
- dealloc方法
dealloc方法基本概念 当一个对象的引用计数器值为0时,这个对象即将被销毁,其占用的内存被系统回收 对象即将被销毁时系统会自动给对象发送一条dealloc消息 (因此, 从dealloc方法有没有 ...
- 一行代码轻松修改 Text Field 和 Text View 的光标颜色 — By 昉
众所周知,Text Field 和 Text View 的光标颜色默认都是系统应用的那种蓝色,如图: 而在实际开发中为了让视觉效果更统一,我们可能会想把那光标的颜色设置成和界面色调一致的颜色.其实在 ...