[leetcode]79.Search Word 回溯法
/**
* 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.
*/
/*
* 回溯法:递归加循环,找准时机回溯状态
* 定义一个数组记录当前位置有没有已经访问过,这个数组就是需要回溯的状态
* 把每个元素当做开头循环一遍,每次判断当前元素的上下左右,如果有符合条件的就再进入递归判断上下左右
* 直到判断到target的最后一个字符符合就返回true,每次把递归放在if的判断条件里,这样只要有一个true就会
* return出去,返回false就再换个位置继续判断
* 注意回溯的位置,是确定当前位置的上下左右都不可用时再回溯*/
public class Q79WordSearch {
public static void main(String[] args) {
char[][] board = new char[][]{{'a','b','c','e'},{'s','f','c','s'},{'a','d','e','e'}};
String word = "abcced";
Q79WordSearch q = new Q79WordSearch();
System.out.println(q.exist(board,word));
}
public boolean exist(char[][] board, String word) {
if (word.length() == 0)
return true;
//记录是否访问过的表格
int[][] flag = new int[board.length][board[0].length];
boolean res = false;
//数组中的每个元素作为开头,遍历一次
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (gobacking(board,word,flag,i,j,0))
return true;
}
}
return false;
}
public boolean gobacking(char[][] board,String word,int[][] flag,int row,int col,int num)
{
char ch = word.charAt(num);
//越界或者访问过就返回
if (row < 0 || row > board.length-1 || col < 0 ||col > board[0].length-1 || flag[row][col] == 1)
return false;
//不符合条件
if (ch != board[row][col])
return false;
//符合条件,记录数组相应位置置1,代表访问过了
flag[row][col] = 1;
//如果最后一个位置的字母也相等,那就是符合条件了
if (num == word.length()-1)
return true;
for (int i = -1;i <= 1;i++)
{
for (int j = -1; j <= 1; j++) {
// 只循环上下左右
if (Math.abs(i) == Math.abs(j))
continue;
//只有符合条件才会往下判断
if (gobacking(board,word,flag,row+i,col+j,num+1))
return true;
}
}
//执行到这里就是没有符合条件的,回溯,把此次的位置置0
flag[row][col] = 0;
//能执行到这里说明没有符合条件的
return false;
}
}
[leetcode]79.Search Word 回溯法的更多相关文章
- LeetCode刷题笔记-回溯法-括号生成
题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "( ...
- LeetCode刷题笔记-回溯法-分割回文串
题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...
- LeetCode刷题笔记-回溯法-组合总和问题
题目描述: <组合总和问题>给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. cand ...
- Leetcode之回溯法专题-79. 单词搜索(Word Search)
Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
- LeetCode(79) Word Search
题目 Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fro ...
- LeetCode 79 Word Search(单词查找)
题目链接:https://leetcode.com/problems/word-search/#/description 给出一个二维字符表,并给出一个String类型的单词,查找该单词是否出现在该二 ...
- leetcode 79. Word Search 、212. Word Search II
https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...
- LeetCode 79. 单词搜索(Word Search)
题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被 ...
随机推荐
- 推荐系统实践 0x0a 冷启动问题
什么是冷启动问题 如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统,就是冷启动问题.冷启动问题主要分为三类: 用户冷启动 物品冷启动 系统冷启动 下面我们将 ...
- UUID介绍与生成的方法
什么是UUID? UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符.UUID具有以下涵义: 经由一定的算法 ...
- sql server full join拼接表数据,按组加序号
--查询所有数据select A.*,B.* from(select z.id,z.requestId,z.FBillNo,dt5.FCauseAndProcess,dt5.FEquipmentNo, ...
- Python正则表达式\W+和\W*匹配过程的深入分析
在学习re.split函数的处理过程中,发现执行如下语句及返回与老猿预想的不一致: >>> re.split('\W*','Hello,world') ['', 'H', 'e', ...
- 第15.14节 PyQt(Python+Qt)入门学习:Designer的Buttons按钮详解
一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按钮).Tool Button(工具按钮).Radio Button(单选按钮).Check Box( ...
- 自学linux——21. NFS服务器的搭建
NFS服务器的搭建 1.NFS的认识 NFS(Network File System即网络文件系统)服务最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享文件,可以将远程 Linu ...
- OA公文流转系统(未完成)
基本页面比较多,所以就不贴出来了,具体的页面可以自行浏览. 点我进入OA系统浏览界面(未做响应式布局,需电脑端打开) 账号密码: 部门:bumen------bumen 办公室:bangongshi- ...
- numpy 中的堆叠 stack
参考: https://blog.csdn.net/Riverhope/article/details/78922006 vstack,vertical 垂直堆叠 hstack, horizontal ...
- SpringBoot瘦身部署(15.9 MB - 92.3 KB)
1. 简介 SpringBoot项目部署虽然简单,但是经常因为修改了少量代码而需要重新打包上传服务器重新部署,而公网服务器的网速受限,可能整个项目的代码文件仅仅只有1-2MB甚至更少,但是需要上传 ...
- Python定时任务利器—Apscheduler
导语 在工作场景遇到了这么一个场景,就是需要定期去执行一个缓存接口,用于同步设备配置.首先想到的就是Linux上的crontab,可以定期,或者间隔一段时间去执行任务.但是如果你想要把这个定时任务作为 ...