zoukankan      html  css  js  c++  java
  • 剑指Offer-65.矩阵中的路径(C++/Java)

    题目:

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

    分析:

    实际上就是在一个二维矩阵中搜索包含字符串的字符路径,且经过了的格子不能再选择了。

    遍历二维数组,当发现字符不相同或者索引超出边界时返回false,如果字符相同的话,就在当前字符的位置开始分别向上下左右继续开始下一个字符的搜索,当字符搜索完毕后,意味着我们找到了这样一条字符路径。注意每一次搜索时标记数组的值要改变。

    程序:

    C++

    class Solution {
    public:
        bool hasPath(char* matrix, int rows, int cols, char* str)
        {
            for(int i = 0; i < rows; i++){
                vector<char> temp;
                for(int j = 0; j < cols; ++j){
                    temp.push_back(*(matrix + i * cols + j));
                }
                res.push_back(temp);
            }
            vector<vector<int>> flag(rows, vector<int>(cols, 0));
            for(int i = 0; i < rows; ++i){
                for(int j = 0; j < cols; ++j){
                    if(helper(str, i, j, flag)){
                        return true;
                    }
                }
            }
            return false;
        }
        bool helper(char* str, int x, int y, vector<vector<int>> flag){
            if(*str == '')
                return true;
            if(x < 0 || x >= res.size() || y < 0 || y >= res[0].size() || res[x][y] != *str || flag[x][y] == 1)
                return false;
            flag[x][y] = 1;
            bool res = helper(str+1, x+1, y, flag)
                || helper(str+1, x-1, y, flag)
                || helper(str+1, x, y+1, flag)
                || helper(str+1, x, y-1, flag);
            flag[x][y] = 0;
            return res;
        }
    private:
        vector<vector<char>> res;
    };

    Java

    public class Solution {
        public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
        {
            flag = new int[matrix.length];
            w = cols;
            h = rows;
            for(int i = 0; i < rows; i++){
                for(int j = 0; j < cols; j++){
                     if(helper(matrix, i, j, str, 0)){
                         return true;
                     }
                }
            }
            return false;
        }
        public boolean helper(char[] matrix, int x, int y, char[] str, int n){
            int index = x * w + y;
            if(x < 0 || x > h-1 || y < 0 || y > w-1 || matrix[index] != str[n] || flag[index] == 1)
                return false;
            if(n == str.length-1)
                return true;
            flag[index] = 1;
            boolean res = helper(matrix, x-1, y, str, n+1)
                        || helper(matrix, x+1, y, str, n+1)
                        || helper(matrix, x, y+1, str, n+1)
                        || helper(matrix, x, y-1, str, n+1);
            flag[index] = 0;
            return res;
        }
        private int w;
        private int h;
        private int[] flag; 
    }
  • 相关阅读:
    weblogic10配置JNDI须在JDK1.5上
    JDBC大批量写入数据到SQLServer2000,记录数大于10000
    ASP递归调用:已知节点查找根节点的函数
    window.createPopup()
    Hibernate处理同名实体的方法
    windows下Apache Rewrite .htaccess 设置
    使用jsonlib将java对象转换成json字符串
    关于oracle和jdbc中rowid格式的转化
    [转]MaCfee导致Asp.net/Jmail无法发送邮件的解决办法
    javascript监测(控制 )上传文件大小
  • 原文地址:https://www.cnblogs.com/silentteller/p/12124426.html
Copyright © 2011-2022 走看看