LeetCode:单词搜索

  这道题虽然简单,但是我尝试用了非广度遍历,想来点其他思路的方法,都失败在一些测试用例了,所以这道题感觉用广度遍历,是最容易解决的方法,以及这道题,让我想起了以前学习写游戏编写的寻路算法or最短寻路算法,而且这次的代码简洁,感觉挺好看的…
  

题目简介:

  给定一个二维网格和一个单词,找出该单词是否存在于网格中。

  单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

  示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

  给定 word = “ABCCED”, 返回 true.
  给定 word = “SEE”, 返回 true.
  给定 word = “ABCB”, 返回 false.
  
  

题解:

  思路是广度遍历,注意的是如何解决搜索重复路径。

class Solution {
public:
	vector>dic = { {0,1},{0,-1},{1,0},{-1,0} };
	int row, col;
	int **map;
	~Solution() {
		if (map) {
			for (int i = 0; i < row; i++)
				delete[] map[i];
			delete[] map;
		}
	}
	bool exist(vector>& board, string word) {
		row = board.size(), col = board[0].size();
		map = new int*[row];
		for (int i = 0; i < row; i++)
			map[i] = new int[col];
		for (int i = 0; i < row; i++)
			for (int j = 0; j < col; j++)
				map[i][j] = -1;
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				bool fuck=op(board, word, map, i, j, 0);
				if (fuck)
					return true;
				map[i][j] == -1;
			}
		}
		return false;
	}

	bool op(vector>& vec, string &word, int **map,int x,int y,int pos) {
		if (y<0||x<0||x >= row || y >= col || pos > word.length() - 1)
			return false;
		if (vec[x][y] != word[pos]|| map[x][y] != -1)
			return false;
		if (vec[x][y] == word[pos] && pos == word.length()-1) {
			map[x][y] = pos;
			return true;
		}
		map[x][y] = pos;
		for (auto i : dic) {
			int tx = i[0] + x;
			int ty = i[1] + y;
			bool fk = op(vec, word, map, tx, ty, pos + 1);
			if (fk)
				return true;
		}
		map[x][y] = -1;
		return false;
	}
};

LeetCode:单词搜索_第1张图片

你可能感兴趣的:(算法与LeetCode)