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