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.

算法分析:回溯算法问题。遍历字母表矩阵,然后判断每个字母的上下左右方向是否匹配。维护一个visited数组,来记录路径上已经访问过的元素,防止重复访问。

public class WordSearch
{
	    private int row;
		private int col;
	    public boolean exist(char[][] board, String word) {
			row = board.length;
			col = board[0].length;
			boolean[][] visited = new boolean[row][col];
			for (int i = 0; i < row; i++)
			{
				for (int j = 0; j < col; j++)
				{
					if (dfs(board, word, 0, i, j, visited))
						return true;
				}
			}
			return false;
		}

		private boolean dfs(char[][] board, String word, int index, int rowindex,
				int colindex, boolean[][] visited)
		{
			if (index == word.length())//word全部匹配,直接返回true
				return true;
			if (rowindex < 0 || colindex < 0 || rowindex >= row || colindex >= col)
				return false;
			if (visited[rowindex][colindex])//路径上一步访问过,就忽略
				return false;
			if (board[rowindex][colindex] != word.charAt(index))//不匹配,直接返回false
				return false;
			visited[rowindex][colindex] = true;//匹配,置visited为true
			//当前元素的上下左右是否匹配,只要有一个方向匹配,返回true
			boolean res = dfs(board, word, index + 1, rowindex - 1, colindex,
					visited)
					|| dfs(board, word, index + 1, rowindex + 1, colindex, visited)
					|| dfs(board, word, index + 1, rowindex, colindex + 1, visited)
					|| dfs(board, word, index + 1, rowindex, colindex - 1, visited);
			visited[rowindex][colindex] = false;//递归完后将visited重置为false
			return res;
		}
}
时间: 2024-11-23 00:12:10

Word Search, 在矩阵中寻找字符串,回溯算法的相关文章

LeetCode第[79]题(Java):Word Search(矩阵单词搜索)

题目:矩阵单词搜索 难度:Medium 题目内容: 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

在图中寻找最短路径-----深度优先算法C++实现

求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例,用深度优先算法来实现: 在每一个点都有四个方向(有的点的有些方向不能通过),所以在每一个点处要处理四种方向的情况: 深度优先算法函数怎么写? 也就是写递归函数...但是递归函数肿么写??? 第一:判断初始态,从起点出发,刚开始步数为0:dfs(start_x, start_y, 0); 第二:从起

12 矩阵中的路径

题目描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子. 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入

有关字符串的算法(KMP,Manacher,BM)陆续补充

KMP算法: 引言: KMP算法是一种改进的字符串匹配算法 字符串匹配:即寻找str_target在str_source中出现的位置 没有改进的字符串匹配:用暴力法进行搜索,枚举出所有的情况然后一一比较.缺点:耗费了很多时间,时间复杂度非常高.所以需要改进. 这里举一个暴力匹配的例子: 在"zabcae"中寻找"abcab" : KMP算法优势: 可以看到,每次出现不匹配时,i都会回溯到上一次的位置.而由于前几次比较的结果,可以避免i的回溯,并且找到一个比较好的j的

(每日算法)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 n

回溯法 矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 这是一个可以用回溯法解决的经典题.首先,在矩阵中任选一个格子作为路径的起点.假设矩阵中某个格子的字符为ch,并且这个格子将对应于路径上的第i个字符.如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置.如果路径上的第i个字符正好是ch,那么到相邻的格子寻找路

剑指offer 65.回溯法 矩阵中的路径

题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子. 解题思路

寻找字符串中出现字符最多的次数,出现次数最多的字符,出现次数最多的字符的索引

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <link rel="stylesheet" href="css.css"> <script src="js.js"></script>

使用正则表达式寻找字符串中出现了几个[***]样式的字符串

使用正则表达式寻找字符串中出现了几个[***]样式的字符串 源码如下: - (NSUInteger)analyseRX:(NSString *)string withPatternString:(NSString *)patternString { // \\[[^\\]]+\\] 用以匹配字符串中所出现的 [*] 的个数 // <[^>]+> 用以匹配字符串中所出现的 <*> 的个数 if (string == nil) { return 0; } // 正则表达式 NSR