矩阵中的路径

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如

  • a b c e
  • s f c s
  • a d e e
  • 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

题目链接: 矩阵中的路径

代码

/**
* 标题:矩阵中的路径
* 题目描述
* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中
* 向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
* a b c e
* s f c s
* a d e e
* 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能
* 再次进入该格子。
* 题目链接:
* https://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc?tpId=13&&tqId=11218&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
*/
public class Jz65 {
private final static int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
private int rows;
private int cols; /**
* 回溯法
*
* @param matrix
* @param rows
* @param cols
* @param str
* @return
*/
public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
if (rows == 0 || cols == 0) {
return false;
}
this.rows = rows;
this.cols = cols;
boolean[][] marked = new boolean[rows][cols];
char[][] array = buildMatrix(matrix);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (backtracking(array, str, marked, 0, i, j)) {
return true;
}
}
}
return false;
} private boolean backtracking(char[][] matrix, char[] str, boolean[][] marked, int pathLen, int r, int c) {
if (pathLen == str.length) {
return true;
} if (r < 0 || r >= rows || c < 0 || c >= cols || matrix[r][c] != str[pathLen] || marked[r][c]) {
return false;
} marked[r][c] = true;
for (int[] n : next) {
if (backtracking(matrix, str, marked, pathLen + 1, r + n[0], c + n[1])) {
return true;
}
}
marked[r][c] = false;
return false;
} private char[][] buildMatrix(char[] array) {
char[][] matrix = new char[rows][cols];
for (int r = 0, idx = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
matrix[r][c] = array[idx++];
}
}
return matrix;
} public static void main(String[] args) {
Jz65 jz65 = new Jz65();
Jz65 jz651 = new Jz65();
char[] array = "abcesfcsadee".toCharArray();
char[] array2 = "abcesfcsadee".toCharArray();
boolean result1 = jz65.hasPath(array, 3, 4, "bcced".toCharArray());
boolean result2 = jz651.hasPath(array2, 3, 4, "abcb".toCharArray());
System.out.println(result1);
System.out.println(result2);
}
}

【每日寄语】 放弃很容易,坚持一定很酷!

最新文章

  1. arcgis server10.2.2之地理编码服务发布
  2. 【转】MYSQL入门学习之十三:自定义函数的基本操作
  3. aspx页面生成html
  4. IE6/IE7下margin-bottom失效兼容解决办法及双倍边距问题
  5. hdu 1063 Exponentiation
  6. 简化版可用于多线程的logger
  7. IEnumerable和IEnumerator 详解
  8. Apache与Tomcat区别联系
  9. SQL Server 2000 函数使用---CAST 和 CONVERT
  10. python中的pip安装
  11. Java线程:堵塞队列与堵塞栈
  12. vue+cordova 构建hybrid app
  13. CentOS7: How to resolve curl#56 - &quot;Recv failure: Connection reset by peer&quot;
  14. Spring Boot thymeleaf模版支持,css,js等静态文件添加
  15. GCD(Swift)
  16. iOS版本设置
  17. POJ3723--Conscription(MST)WRONG
  18. log4net 本地环境没问题 生产环境无法输出日志
  19. xpress for node 路由route几种实现方式
  20. Js基础知识5-函数返回值、函数参数、函数属性、函数方法

热门文章

  1. (4)什么是Ribbon负载均衡
  2. Swift 介绍
  3. VC 模拟键盘输入
  4. js Object.prototype.hasOwnProperty() 与 for in 区别
  5. sql注入,xss攻击,csrf(模拟请求),防盗链
  6. 高德地图定位api以及导航和定位 位置的偏差
  7. DHCP原理与LINUX下的配置
  8. PHP面试笔试宝典
  9. x86架构中的外部中断结构-Part 1:中断控制器的演化
  10. Solution -「Gym 102956B」Beautiful Sequence Unraveling