1.题目

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

例如,在下面的3x4的矩阵中包含一条字符串"bfce"的路径,但矩阵中不包含"abcb"路径。因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

2.思路

回朔法判断矩阵中是否有字符串bfce的思路:

首先,在矩阵中查找和字符串第一个字符相同的矩阵元素b。然后,遍历矩阵元素b的上下左右四个字符,如果有和字符串下一个字符相同的矩阵元素f,则遍历矩阵元素f的上下左右四个字符……;如果没有和字符串下一个字符相同的矩阵元素f,则退到上一个字符,重新遍历。为了避免路径重复,需要一个辅助矩阵来记录路径。

3.code

# 返回值:是否存在路径,bool类型

# 参数:matrix矩阵,rows矩阵行数,cols矩阵列数,str字符串

 class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if(matrix == NULL || rows<1 || cols<1|| str ==NULL)// 边界条件
return false; bool *visited = new bool[rows*cols]; // 创建路径数组
memset(visited,0,rows*cols); // 清空路径数组 int pathLength = 0; // 字符串下标
int row = 0; // 矩阵下标
int col = 0; // 矩阵下标
for(int row=0;row<rows;++row) // 遍历矩阵
for(int col=0;col<cols;++col){
if(hasPathCore(matrix,rows,cols,row,col,str,pathLength,visited)){
return true;
}
} delete[] visited; // 销毁路径数组 return false;
} private:
// 递归实现回朔法
bool hasPathCore(char* matrix,int rows,int cols,int row,int col,char* str,int &pathLength,bool* visited){ // 矩阵存在字符串路径(递归出口)
if(str[pathLength] == '\0'){
return true;
} bool hasPath = false;
if(row >= 0 && row < rows && col >= 0 && col < cols && matrix[row*cols+col] == str[pathLength] && !visited[row*cols+col]){
++pathLength; // 矩阵中找到元素str[pathLength],应该找元素str[pathLength+1]
visited[row*cols+col] = true; // 路径矩阵做标记 // 查找矩阵坐标(row,col)上下左右是否存在与str[pathLength+1]相同的元素
hasPath = hasPathCore(matrix, rows, cols, row-1, col, str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row+1, col, str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row, col-1, str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row, col+1, str, pathLength, visited); // 矩阵坐标(row,col)上下左右不存在与str[pathLength+1]相同的元素
if(!hasPath){
--pathLength; // 条件不符合,还原为str[pathLength]
visited[row*cols+col] = false;// 条件不符合,标记数组标记row*cols+col为未被标记
}
}
return hasPath; }
};

最新文章

  1. bzoj3744 Gty的妹子序列
  2. Java面向对象之接口
  3. iOS 原生网络请求(推荐使用AFNetWorking库)
  4. JQuery 操作按钮遮罩(删除)
  5. Weka 入门2
  6. 浅谈Javase内存流程图
  7. PHP核心技术
  8. oracle12c:通过oracle客户端工具配置tns,并使用sqlldr进行批量导入数据
  9. excel日期拾取插件(支持Excel 2007 - 2016)
  10. 为啥百度、网易、小米都用Python?Python的用途是什么?
  11. 关于使用MUI框架ashx获取值的问题
  12. Facebook的一些基本操作(网页版)
  13. asp.net webapi 自定义身份验证
  14. 通过explain分析低效的SQL执行计划
  15. APP注册&amp;登陆 逻辑细节
  16. InertialNav
  17. urllib2特点--urllib2.build_opener对象接口
  18. Field &#39;***********&#39; doesn&#39;t have a default value
  19. SQLite使用入门
  20. MySQL导出表结构方法

热门文章

  1. ASP.NET OAuth Authorization - Difference between using ClientId and Secret and Username and Password
  2. Elasticsearch之几个重要的分词器
  3. scala中的高阶函数
  4. [Network Architecture]DPN(Dual Path Network)算法详解(转)
  5. 一些常用的CDN列表
  6. zlib编译方法
  7. P3600 随机数生成器
  8. RestTemplate请求https忽略证书认证
  9. 如何理解nRF5芯片外设PPI
  10. js实现类名的添加与移除