【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 =
[
["ABCE"],
["SFCS"],
["ADEE"]
]
word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.
题解:实现一个DFS函数 private boolean canFind(char[][] board,int i,int j,String left,boolean[][] visited) ,从(i,j)出开始搜索串left,visited数组记录某个位置是否包含在当前搜索的路径中,因为每个字符只能被使用一次。
代码如下:
 public class Solution {
         private boolean canFind(char[][] board,int i,int j,String left,boolean[][] visited){
         //if we have found one path
         if(left.equals(""))
             return true;
         //look around point(i,j) see if we can find next char
         char next = left.charAt(0);
         if(i-1>=0 && !visited[i-1][j] && board[i-1][j]== next ){
             visited[i-1][j] = true;
             if(canFind(board, i-1, j, left.substring(1),visited))
                 return true;
             visited[i-1][j]= false;
         }
         if(j-1>=0 && !visited[i][j-1] && board[i][j-1]== next ){
             visited[i][j-1] = true;
             if(canFind(board, i, j-1, left.substring(1),visited))
                 return true;
             visited[i][j-1]= false;
         }
         if(i+1 < board.length && !visited[i+1][j] && board[i+1][j]== next ){
             visited[i+1][j] = true;
             if(canFind(board, i+1, j, left.substring(1),visited))
                 return true;
             visited[i+1][j]= false;
         }
         if(j+1 < board[0].length && !visited[i][j+1] && board[i][j+1]== next ){
             visited[i][j+1] = true;
             if(canFind(board, i, j+1, left.substring(1),visited))
                 return true;
             visited[i][j+1]= false;
         }
         return false;
     }
     public boolean exist(char[][] board, String word) {
         if(word == null || word.length() == 0)
             return true;
         if(board.length == 0)
             return false;
         int m = board.length;
         int n = board[0].length;
         char now = word.charAt(0);
         boolean[][] visited = new boolean[m][n];
         //search board for our first char in word
         for(int i = 0;i < m;i++){
             for(int j = 0;j < n;j ++){
                 if(board[i][j]== now ){
                     visited[i][j]= true;
                     if(canFind(board, i, j, word.substring(1),visited))
                         return true;
                     visited[i][j]= false;
                 }
             }
         }
         return false;
     }
 }
【leetcode刷题笔记】Word Search的更多相关文章
- 【leetcode刷题笔记】Search in Rotated Sorted Array II
		Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ... 
- 【leetcode刷题笔记】Search in Rotated Sorted Array
		Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ... 
- 【leetcode刷题笔记】Search a 2D Matrix
		Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ... 
- LeetCode刷题笔记和想法(C++)
		主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ... 
- 18.9.10 LeetCode刷题笔记
		本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ... 
- LeetCode刷题笔记 - 12. 整数转罗马数字
		学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ... 
- 刷题79. Word Search
		一.题目说明 题目79. Word Search,给定一个由字符组成的矩阵,从矩阵中查找一个字符串是否存在.可以连续横.纵找.不能重复使用,难度是Medium. 二.我的解答 惭愧,我写了很久总是有问 ... 
- Leetcode刷题笔记(双指针)
		1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ... 
- 【leetcode刷题笔记】Word Ladder II
		Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ... 
随机推荐
- Java学习从入门到精通(1) [转载]
			Java Learning Path (一).工具篇 一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envi ... 
- WCF获取元数据
			所谓获取WCF的服务元数据(Metadata),归根结点,实际上就是获取服务的终结点(Endpoint)的信息,这是服务公开在外的数据信息,包括Address.Binding与Contract,也就是 ... 
- 进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
			摘要:本文主要介绍进程的基本属性,基本属性包含:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义: #include <sys/typ ... 
- vi/vim复制粘贴命
			1. 选定文本块.使用v进入可视模式,移动光标键选定内容. 2.复制的命令是y,即yank(提起) ,常用的命令如下: y 在使用v模式选定了某一块的时候,复制选定块到缓冲区用: ... 
- 跟我一起写 Makefile(三)[转]
			原文链接 http://bbs.chinaunix.net/thread-408225-1-1.html(出处: http://bbs.chinaunix.net/) make 的运行—————— 一 ... 
- 学习IIS & MVC的运行原理
			我一直疑惑于以下问题,从客户端发出一个请求,请求到达服务器端是怎样跟iis衔接起来的,而iis又是怎样读取我发布的代码的,并返回服务器上的文件.这其中是怎样的一个处理过程. 1:当你从浏览器中输入一个 ... 
- windows_64下python下载安装Numpy、Scipy、matplotlib模块
			本文应用的python3.6.3及其对应的Numpy.Scipy.matplotlib计算模块的cp36版本,其中Numpy是需要MKL版本的Numpy,这是后续安装Scipy的需要(本机系统win7 ... 
- erlang的md5加密
			二话不说,直接上代码 -module(md5). -compile(export_all). md5(S) -> Md5_bin = erlang:md5(S), Md5_list = bina ... 
- thinkPHP5.0的学习研究【架构】
			2017年6月19日18:51:53 架构:1.ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织.2.MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC ... 
- TextView实现打印机效果 ,字符串逐字显示
			https://github.com/lygttpod/AndroidCustomView/blob/master/app/src/main/java/com/allen/androidcustomv ... 
