矩阵中的路径-剑指Offer

矩阵中的路径

题目描述

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

思路

  1. 这个题目涉及到回溯算法,我们可以用一个栈来存储矩阵中的元素,当遍历到某个元素无法再进行下去的时候,我们就弹栈再继续从周围元素寻找匹配点
  2. 我们可以将矩阵做一下处理,使其每次匹配时每个位置的元素都可以和周围的元素做比较:
    • #,#,#,#,#,#
    • #,a,b,c,e,#
    • #,s,f,c,s,#
    • #,a,d,e,e,#
    • #,#,#,#,#,#
  3. 因为每次走的路径不能重复,所以我们需要再生成一个大小相等的矩阵用来记录这个位置是否走过
  4. 栈中存储的是每个元素的位置信息

代码

import java.util.Stack;
public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
    	if (matrix == null || str == null || (matrix.length == 0 && str.length != 0)) {
			return false;
		}
		if (str.length == 0) {
			return true;
		}
		char[][] data = new char[rows + 2][cols + 2];
		for (int i = 0; i < rows + 2; i++) {
			for (int j = 0; j < cols + 2; j++) {
				if (i == 0 || i == (rows + 1) || j == 0 || j == (cols + 1)) {
					data[i][j] = ‘#‘;
				} else {
					data[i][j] = matrix[(i - 1) * cols + j - 1];
				}
			}
		}
		boolean[][] flag = new boolean[rows + 2][cols + 2];
		for (int i = 0; i < rows + 2; i++) {
			for (int j = 0; j < cols + 2; j++) {
				flag[i][j] = true;
			}
		}
		int point = 0;
		Stack stack = new Stack();

		for (int i = 1; i < rows + 1; i++) {
			for (int j = 1; j < cols + 1; j++) {
				if (data[i][j] == str[point]) {
					int[] position = {i, j};
					flag[i][j] = false;
					stack.push(position);
					point++;
				}
				while (!stack.isEmpty() && point < str.length) {
					int[] temp = (int[]) stack.peek();
					int row = temp[0];
					int col = temp[1];
					if (data[row - 1][col] == str[point] && flag[row - 1][col] == true) {
						int[] position = {row - 1, col};
						flag[position[0]][position[1]] = false;
						stack.push(position);
						point++;
					} else if (data[row][col + 1] == str[point] && flag[row][col + 1] == true) {
						int[] position = {row, col + 1};
						flag[position[0]][position[1]] = false;
						stack.push(position);
						point++;
					} else if (data[row + 1][col] == str[point] && flag[row + 1][col] == true) {
						int[] position = {row + 1, col};
						flag[position[0]][position[1]] = false;
						stack.push(position);
						point++;
					} else if (data[row][col - 1] == str[point] && flag[row][col - 1] == true) {
						int[] position = {row, col - 1};
						flag[position[0]][position[1]] = false;
						stack.push(position);
						point++;
					} else {
						stack.pop();
						point--;
					}
				}
				if (point == str.length) {
					return true;
				}
				for (int m = 0; m < rows + 2; m++) {
					for (int n = 0; n < cols + 2; n++) {
						flag[m][n] = true;
					}
				}
			}
		}
		return false;
    }

}
时间: 2025-01-18 15:18:30

矩阵中的路径-剑指Offer的相关文章

二叉树中和为某一值的路径-剑指Offer

二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 用栈来存储二叉树的路径,遍历到叶子结点就判断是否总和为target,是的话打印,若不是叶子结点,那继续遍历左右子树 注意:打印完后返回父结点时要弹出栈顶的叶子结点,并且总和减去该值 注意:打印路径时要遍历栈 代码 import java.util.ArrayList; import java.util.Stack;

item3 二维数组中的查找[剑指offer]

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有这个整数? 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 思路:查找7 从右上角的数组开始判断:9>7,又因为每一列从上到下递增,所以这一列淘汰 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 接着第三列也被排除 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11

二维数组中的查找-剑指Offer

二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入描述 array: 待查找的二维数组 target:查找的数字 输出描述 查找到返回true,查找不到返回false 思路 因为数组是从左到右从上到下都是递增排序的,所以我们可以从右上角开始查找,如果右上角的数比target大,那它所在的这一列都大,可以舍去,直到找到小的,然后开始从上向下找,若右上

数据流中的中位数-剑指Offer

数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路 我们可以用数组存,每次取中位数时需要排序 我们也可以用平衡二叉树存,不过构造树的过程很复杂 我们也可以用大小堆存,不过也不简单 最后我选择用java里现成的ArrayList存,用Collections.sort()方法排序 代码 import java.util.ArrayL

面试题03_二维数组中查找_剑指offer系列

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路: 这是一道考查二维数组的理解和编程能力的题. 在二维数组在内存中是连续存储的.在内存中从上到下存储各行元素,在同一行中按照从左到右存储. 因此可以按照行号和列号来计算出相对数组首部的位置. 由于每一行 和 每一列都是有序的,因此,我们可以拿要查找的数与数组的右上角的数进行比较. 因为每一行从左到右递增,每一列

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

【剑指offer】字符串转整数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/28015693 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000). 输出: 对应每个测试案例,若输入为一个合法的字符串(即代表一个整数),则输出这个整数.若输入为一个非法的字符串,则输出"My God". 样

《剑指offer》第十二题:矩阵中的路径

// 面试题12:矩阵中的路径 // 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 // 字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右. // 上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入 // 该格子.例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字 // 母用下划线标出).但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个 // 字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个