/**
* 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 回溯法的更多相关文章

  1. LeetCode刷题笔记-回溯法-括号生成

    题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "( ...

  2. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

  3. LeetCode刷题笔记-回溯法-组合总和问题

    题目描述: <组合总和问题>给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. cand ...

  4. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  5. Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)

    Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...

  6. 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 ...

  7. LeetCode 79 Word Search(单词查找)

    题目链接:https://leetcode.com/problems/word-search/#/description 给出一个二维字符表,并给出一个String类型的单词,查找该单词是否出现在该二 ...

  8. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  9. LeetCode 79. 单词搜索(Word Search)

    题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被 ...

随机推荐

  1. 图像分割必备知识点 | Unet++超详解+注解

    文章来自周纵苇大佬的知乎,是Unet++模型的一作大佬,其在2019年底详细剖析了Unet++模型,讲解的非常好.所以在此做一个搬运+个人的理解. 文中加粗部分为个人做的注解.需要讨论交流的朋友可以加 ...

  2. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  3. PyQt(Python+Qt)学习随笔:QTableWidgetItem的位置相关方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidgetItem项在QTableWidget中的位置包括三个属性来决定,就是表格部件 ...

  4. 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也

    正则表达式的章节到此就结束了,老猿现在觉得对我们这些身具程序猿基因特色的人来说,正则表达式应该是蛮可口的开胃小菜. 在写标题时,本来想写"正则表达式小结",后来想了想,百度了一下, ...

  5. 问题:PyCharm调试方法Force run to cursor与run to cursor的区别

    Force run to cursor与run to cursor的差别是,后者在执行到光标的代码行前,如果有代码中设置了断点,会在该断点处暂停,等待进一步调试指令,而Force run to cur ...

  6. CNVD漏洞证书(2)

    第二张CNVD的原创漏洞证书. 关于证书申请可以看我之前写的这篇博客: https://www.cnblogs.com/Cl0ud/p/12720413.html 继续加油

  7. 【题解】「CF363A」Soroban

    哎呀呀,咕值要掉光了,赶快水篇题解( solution 这题就是个纯模拟,首先我们根据输出样例看一下输出算盘的规则. 看数最大的 720 ,我们发现,输出的算盘张这样(之所以我不用代码框而用 \(\K ...

  8. 【置顶】Trotyl's OI tree

    \(\rm thx\):@\(\rm UntilMadow\) ! \(\color{Green}{\rm Pupil}\) :只会一点点 \(\color{blue}{\text{Expert}}\ ...

  9. maven私有仓库搭建(nexus)

    搭建是参考博客:https://blog.csdn.net/zn353010922/article/details/79441122 切换到nexus目录的bin下 启动.状态.停止:./nexus ...

  10. mac下git连接github远程仓库

    git配置 一.安装git 官方网站下载安装,如果有安装homebrew,在终端输入brew install git,安装后的位置在/Users/计算机用户名目录下安装完成后,在终端输入git --v ...