剑指offer系列39-----矩阵中的路径

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

 1 package com.exe8.offer;
 2
 3 /**
 4  * 【题目】请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
 5  *            路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
 6  *        如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
 7  *           例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,
 8  *                因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
 9  * @author rhwayfun
10  *
11  */
12 public class HasPath {
13
14    public boolean hasPath(char[] matrix,int rows,int cols,char[] str){
15        boolean[] visited=new boolean[matrix.length];
16        for(int i=0;i<rows;i++){
17            for(int j=0;j<cols;j++){
18                if(hasPathCore(matrix,rows,cols,i,j,0,str,visited)){
19                    return true;
20                }
21            }
22        }
23        return false;
24
25    }
26    //k表示在str字符串中数的位置
27     private boolean hasPathCore(char[] matrix, int rows, int cols,
28                                 int i, int j, int k, char[] str, boolean[] visited) {
29         //获取指定数在矩阵中的下标
30         int index=i*cols+j;
31         if(i<0 || i>=rows ||j<0 || j>=cols
32            ||matrix[index]!=str[k] ||visited[index])
33             return false;
34         visited[index]=true;
35         if(k==str.length-1)//表面要找的字符全部找到
36             return true;
37         //如果没有递归到最后一个字符  就k+1依次寻找str下个字符
38         if(hasPathCore(matrix, rows, cols, i-1, j, k+1, str, visited)
39          ||hasPathCore(matrix, rows, cols, i+1, j, k+1, str, visited)
40          ||hasPathCore(matrix, rows, cols, i, j-1, k+1, str, visited)
41          ||hasPathCore(matrix, rows, cols, i, j+1, k+1, str, visited)){
42             return true;
43         }else{
44             k--;
45             visited[index]=false;
46         }
47
48
49         return false;
50     }
51     public static void main(String[] args) {
52         String s= "abcesfcsadee";
53         String s2 = "bcced";
54         char[] matrix = s.toCharArray();
55         char[] str = s2.toCharArray();
56         boolean b = new HasPath().hasPath(matrix, 3, 4, str);
57         System.out.println(b);
58     }
59 }
时间: 2024-10-19 17:45:53

剑指offer系列39-----矩阵中的路径的相关文章

《剑指offer》:[66]矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 具体是例如下图: 上图中"bcced"就存在这条路径:但是"abcb"这条路径就不存在.因为进入'b'这个格子后就不能再次进入. 解决方案:主要是用回溯法.首先任意选一个入口地址,也就是任选一个格子,如果格子中的字符ch和字符串中的第一个字符相等,

剑指offer系列61---数组中的逆序对

[题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统计子数组的逆序对: * 再合并,统计整个的逆序对. 1 package com.exe11.offer; 2 3 /** 4 * [题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 5 * [思路]运用归并排序的思想.

剑指offer系列54---数组中出现次数超过一半的数

[题目]数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. * [思路]首先取第一个数,之后的数与其比较.相同次数+1:不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1. * 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0: 1 package com.exe11.offer; 2 3 /**

剑指offer系列24---数组中重复的数字

* [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 书上方法: 1 package com.exe6.offer; 2 /** 3 * [24] 4 * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. 5 * 数组中某些

剑指offer系列57---整数中1出现的次数

[题目]求出1~n的整数中1出现的次数.(10进制) 1 package com.exe11.offer; 2 /** 3 * [题目]求出1~n的整数中1出现的次数. 4 * @author WGS 5 * 6 */ 7 public class NumberOf1 { 8 9 public int getNumberOf1Between1AndN(int n){ 10 if(n<=0) return 0; 11 if(n<=9) return 1; 12 int count=0; 13 f

剑指offer系列——35.数组中的逆序对??

Q:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入: 1,2,3,4,5,6,7,0 输出: 7 T:引用:https://blog.

剑指offer系列39:把字符串转换成整数

主要代码其实很少,主要是对各种情况的判断.在做题的时候一定要考虑到各种情况的非法输入. 1.前面的空格需要跳过 2.判断数字的正负号并记录 3.如果有非法输入例如字母和其他非数字和正负号的字符,退出返回0 4.返回的是一个数字,所以一定要考虑数字的边界问题 5.对于各种情况考虑到之后最好再加一个无条件的输出语句,防止没有考虑到的情况发生 1 class Solution { 2 public: 3 int StrToInt(string str) { 4 if (str.empty()) 5 r

剑指offer系列——10.矩阵覆盖

Q:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? C:时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M T:@flysall 第一种情况等价于情形1中阴影部分的n-1块矩形有多少种覆盖方法,为f(n-1); 第二种情况等价于情形2中阴影部分的n-2块矩形有多少种覆盖方法,为f(n-2); 故f(n) = f(n-1) + f(n-2),还是一个斐波那契数列.... A: int r

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.