zoukankan      html  css  js  c++  java
  • # 剑指Offer 12 矩阵中的路径

    剑指Offer 12 矩阵中的路径

    给定一个字符矩阵和一个字符串,判断矩阵中是否存在一条路径能够匹配该字符串

    执行用时:7 ms, 在所有 Java 提交中击败了44.58%的用户
    内存消耗:41.8 MB, 在所有 Java 提交中击败了45.65%的用户

    DFS+回溯

    class Solution {
        public boolean exist(char[][] board, String word) {
        	/*字符矩阵中找一条满足给定词汇的路径
        	 * 算法:深度优先搜索DFS+剪枝
        	 * 实现:递归(需要额外写递归函数)
        	 * */
             /*输入合法性*/
        	int rows = board.length, cols = board[0].length;
            if(word.length()>rows*cols) return false;
    
        	char[] w = word.toCharArray();
        	for(int i=0;i<rows;i++)
        		for(int j=0;j<cols;j++) {
        			if(dfs(board,i,j,w,0)) return true;
        		}
        	return false;
        }
        
        /*搜索函数(递归调用)dfs
         * param1: 搜索矩阵 matrix
         * param2: 起点位置 (i,j)
         * param3: 搜索字符 word[k] k为搜索深度
         * */
        public boolean dfs(char[][] matrix, int i, int j, char[] word, int k) {
        	/*边界合法性*/
        	/*搜索超过矩阵边界 or 字符不匹配*/
        	if(i<0 || i>=matrix.length || j<0 || j>=matrix[0].length || matrix[i][j]!=word[k])
        		return false;
        	/*到达底部,搜索结束*/
        	if(k==word.length-1) return true;
        	
        	/*深度搜索*/
        	/*搜索顺序:下、上、右、左*/
        	/*防止重复搜索(即搜索到上一次的字符), 搜索完后需要恢复(指针传递)*/
        	char temp = matrix[i][j];
        	matrix[i][j] = '/';
        	boolean res = dfs(matrix,i+1,j,word,k+1) || dfs(matrix,i-1,j,word,k+1) 
        							|| dfs(matrix,i,j-1,word,k+1) || dfs(matrix,i,j+1,word,k+1);
        	matrix[i][j] = temp;
        	return res;
        }
    }
    
  • 相关阅读:
    设计模式(08):结构型模式(二) 桥接模式(Bridge)
    设计模式(07):结构型模式(一) 适配器模式(Adapter)
    设计模式(06):创建型模式(五) 原型模式(Prototype)
    node.js获取cookie
    排序算法[转]
    Observer(观察者)设计模式[转]
    c#发送Http请求
    win+R下的命令
    display:inline、block、inline-block的区别
    Redis安装
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13521951.html
Copyright © 2011-2022 走看看