矩阵每一行重复_【剑指offer】65 矩阵中的路径

4d9bb8aef45b889ee20f3c59e41bae9a.gif

题目描述

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

1aeaa7c1f488bfdc3e37af6f86aadd95.png

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

示例1

输入

 "ABCESFCSADEE",3,4,"ABCCED"

返回值

 true

示例2

输入

 "ABCESFCSADEE",3,4,"ABCB"

返回值

 false

- 解题思路

分析:回溯算法 这是一个可以用回朔法解决的典型题。首先,在矩阵中任选一个格子作为路径的起点。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置。如果路径上的第i个字符正好是ch,那么往相邻的格子寻找路径上的第i+1个字符。除在矩阵边界上的格子之外,其他格子都有4个相邻的格子。重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。  由于回朔法的递归特性,路径可以被开成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。  由于路径不能重复进入矩阵的格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入每个格子。当矩阵中坐标为(row,col)的格子和路径字符串中相应的字符一样时,从4个相邻的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路径字符串中下一个字符如果4个相邻的格子都没有匹配字符串中下一个的字符,表明当前路径字符串中字符在矩阵中的定位不正确,我们需要回到前一个,然后重新定位。  一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到合适的位置

- Java实现

public class Solution {    private final static int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};    private int rows;    private int cols;    public boolean hasPath(char[] array, 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[][] matrix = buildMatrix(array);        for (int i = 0; i < rows; i++)            for (int j = 0; j < cols; j++)                if (backtracking(matrix, 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;    }}

d463bf441d7ec4272c59721d2baf8119.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是单工、半双工和双工通信?有哪些实际应用的例子

根据数据信息在传输线上的传送方向&#xff0c;数据通信方式分为单工通信 半双工通信和全双工通信3种。 1&#xff09;单工通信 数据信息在通信线上始终向一个方向传输。数据信息永远从发送端传输到接收端。列如&#xff0c;广播电视就是单工传输方式&#xff0c;收音机电视机只…

mysql5.464位下载_MySQL Front 64位

MySQL-Front是一款实用的MYSQL数据库管理工具&#xff0c;软件自带了简体中文语言&#xff0c;与mysql数据库连接后就可以对其地蚝各类管理操作了&#xff0c;比如对域进行编辑、增加和删除&#xff0c;执行sql脚本或者导出数据库等操作&#xff0c;除此之外还可以将数据库保存…

a5d27 emmc启动 修改2

修改第2级bootloader的include/configs/sama5d2_xplained.h文件 #define FAT_ENV_DEVICE_AND_PART "0" #define CONFIG_BOOTCOMMAND "fatload mmc 0:1 0x21000000 at91-sama5d2_xplained.dtb; " \ "fatload mmc 0:1 0x22000000 zImage; " \ &q…

监听APP升级广播处理

当旧版本的用户升级新版本的时候需要重新设定一些值处理,这时候需要监听升级版本的广播 <receiver android:name".OnUpgradeReceiver"><intent-filter><action android:name"android.intent.action.PACKAGE_REPLACED" /><data androi…

mysql linux 优化_mysql在linux中内核优化

linux内核优化,直接修改/etc/sysctl.conf执行 sysctl -p立即生效# 每个端口监听队列最大长度net.core.somaxconn 65535# 增加系统文件描述符限制fs.file-max 65535# 当网络接受速率大于内核处理速率时&#xff0c;允许发送到队列中的包数目net.core.netdev_max_backlog 6553…

a5d27 第1级bootloader启动问题

drivers/sdhc.c里的 static int sdhc_set_clock(struct sd_card *sdcard, unsigned int clock) 这段代码总是会超时&#xff0c;造成启动失败。 log如下图

LDA-Latent Dirichlet Allocation 学习笔记

以下内容主要基于《Latent Dirichlet Allocation》,JMLR-2003一文&#xff0c;另加入了一些自己的理解,刚开始了解&#xff0c;有不对的还请各位指正。 LDA-Latent Dirichlet Allocation JMLR-2003 摘要&#xff1a;本文讨论的LDA是对于离散数据集&#xff0c;如文本集&#xf…

A5D2应用程序无法启动问题

给/lib/ld-2.22.so文件&#xff0c;建立名称为ld-linux.so.3的软连接即可。 或者编译程序的时候&#xff0c;用-s选项&#xff0c;将库文件编译进程序

mysql 表上限_mysql 数据库表的上限

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

app 图标规格参考表

转自&#xff1a;http://www.cocoachina.com/appstore/top/2012/1105/5031.html 像我一样记不住iOS应用图标像素尺寸的开发者不在少数&#xff0c;我经常需要查询不同设备上的应用尺寸&#xff0c;为了方便自己、方便大家&#xff0c;我制作了下面的图表供大家参考。 iPhone、i…

visual studio 的各个版本下载地址

Microsoft Visual Studio 6.0 下载&#xff1a;英文版360云盘下载&#xff1a; http://l11.yunpan.cn/lk/sVeBLC3bhumrI英文版115网盘下载&#xff1a; http://115.com/file/bew2qrau英文版迅雷下载&#xff1a; http://61.138.140.18/download/jlste_nw/vs6en.isoFTP下载&…

mysql数据表内容_MySQL数据表

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

.net Reflection(反射)- 二

反射 Reflection 中访问方法 新建一个ClassLibrary类库&#xff1a; public class Student{public string Name{ get; set; }public string School{ get; set; }public int Sum(int a, int b){return a b;}public string GetName(){return "this is book" ;} } /…

osg坐标系统

OpenGL的世界坐标轴向可以看做是&#xff1a;x轴向右&#xff0c;y轴向上&#xff0c;z轴向屏幕外。 在osg中实际上也是一样的&#xff0c;只不过漫游器在设置视点时把视点设置在了y轴负方向并朝向y轴正向&#xff0c;导致这二者看起来坐标系统不一致。 感觉像是OpenGL坐标系…

mysql数据库开启远程连接_安装MySQL数据库并开启远程访问

一、安装MySQL数据库MySQL安装在系统盘下(C:\Program Files)&#xff0c;方便系统备份。1.双击安装程序&#xff0c;勾选“I accept the license terms”&#xff0c;点击“Next”按钮。2.检测需要的安装&#xff0c;直接点击Next。3.按照下图所示步骤安装。4.设置密码&#xf…

sockaddr类型重定义

这时说的sockaddr类型重定义错误, 实际上包括一大堆: sockaddr, ;sockaddr_in等等. 这是由于windows.h和winsock2.h包含的顺序而造成的错误: 正确的顺序是先包含winsock2.h再包含windows.h, 但好多情况下, 程序最前端往往都是#include <windows.h>, 所以在后面的程序中(尤…

tomcat 访问去掉项目名 直接访问 localhsot

1.eclipse->项目->右键->Properties->Web Project Setting->context root 设置为"/"或者"" 2.tomcat5.0/6.0&#xff1a;<Host></Host>间加了一句<Context path"" docBase"/fts" debug"0" re…

mysql主从同步表结构_mysql主从同步的结构模式

一主一从(重要)&#xff0c;一主多从(最常用)&#xff0c;主从从&#xff0c;主主结构&#xff1b;控制主从同布时&#xff0c;备份指定的数据库而不是备份所有的库&#xff1a;1 在主数据库服务端配置&#xff1a;vim /etc/my.cnf[mysqld]binlog-do-dbdb_name #只允许同步这…

GDI+ 使用指南(basic guiding of GDI plus )

其实这个也没有什么用&#xff0c;毕竟已经是过时的技术了。不过技术的更新跟实际的使用还是有差距了&#xff0c;免不了还是要用这种过时的技术&#xff0c;所以还是记录下来&#xff0c;方便以后查阅。   GDI没记错的话是跟随XP诞生的&#xff0c;是XP系统上的图形绘制系统…

gunzip 和 unzip 解压文件到指定的目录

gunzip 和 unzip 解压文件到指定的目录 Linux 常用的压缩命令有 gzip 和 zip&#xff0c;两种压缩包的结尾不同&#xff1a;zip 压缩的后文件是 *.zip &#xff0c;而 gzip 压缩后的文件 *.gz 相应的解压缩命令则是 gunzip 和 unzip gzip 命令&#xff1a; # gzip test.txt 它会…