美文网首页
[JS]回溯算法之矩阵中的路径

[JS]回溯算法之矩阵中的路径

作者: easy_mark | 来源:发表于2019-09-26 15:22 被阅读0次

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

思路: 第n个字符满足在字符串的第i个位置相等,如果第n个字符的上下左右也就是n+1路径上没有符合与i+1的字符串的字符相等的话,就倒退到n-1位置重新匹配。

代码实现:

function hasPath(arr, rows, cols, str) {
    if (rows <= 0 || cols <= 0 || !str) return false;
    let strLength = 0;//当前要匹配的字符串下标
    var visitedArr = new Array();
    //初始化标记数组
    for (let i = 0; i < rows; i++) {
        visitedArr[i] = new Array();
        for (let j = 0; j < cols; j++) {
            visitedArr[i][j] = false;
        }
    }
    for (let row = 0; row < rows; row++) {
        for (let col = 0; col < cols; col++) {
            if (hasPathCore(arr, rows, cols, str, strLength, row, col, visitedArr))
                return true;
        }
    }
    return false;
}

function hasPathCore(arr, rows, cols, str, strLength, row, col, visitedArr) {
    if (str[strLength] == undefined) return true;

    var hasPath = false;
    if (row >= 0 && row < rows && col >= 0 && col < cols && arr[row][col] == str[strLength] && !visitedArr[row][col]) {
        visitedArr[row][col] = true;
        ++strLength;
        hasPath = hasPathCore(arr, rows, cols, str, strLength, row, col + 1, visitedArr) ||
            hasPathCore(arr, rows, cols, str, strLength, row, col - 1, visitedArr) ||
            hasPathCore(arr, rows, cols, str, strLength, row + 1, col, visitedArr) ||
            hasPathCore(arr, rows, cols, str, strLength, row - 1, col, visitedArr)

        if (!hasPath) {
            --strLength;
            visitedArr[row][col] = false;
        }
    }
    return hasPath;

}

测试case:

var arr_ = new Array();
var stack = ['a','v','x','s','a','w','s','d','a'];
for(let i=0;i<3;i++){
    arr_[i] = new Array();
    for(let j=0;j<3;j++){
        arr_[i][j] = stack.shift();
    }
}
arr_
(3) [Array(3), Array(3), Array(3)]0: (3) ["a", "v", "x"]1: (3) ["s", "a", "w"]2: (3) ["s", "d", "a"]length: 3__proto__: Array(0)
hasPath(arr_, 3, 3, 'aa')
false
hasPath(arr_, 3, 3, 'asad')
true

git仓库会更新剑指offer的相关数据结构与算法的JS实现版本,频率一周3~5篇左右
git地址

相关文章

  • [JS]回溯算法之矩阵中的路径

    题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,...

  • 回溯法——矩阵中的路径

    回溯法回溯法可以看成蛮力法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案。回溯法非常适...

  • 12-矩阵中的路径-回溯

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步...

  • 回溯,贪心,动态规划

    1.回溯算法思想leetcode 112 号算法题:路径总和leetcode 113 号算法题:路径总和 IIle...

  • 《剑指Offer》回溯 矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格...

  • 剑指Offer(二)

    题目汇总11.旋转数组的最小数字(简单),本题考查查找和排序12.矩阵中的路径—回溯问题(中等),本题考查回溯法1...

  • 【JS算法】回溯算法

    题目:全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列输入:nums = [1,2,3] ...

  • 算法-12.矩阵中的路径

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步...

  • 回溯算法

    回溯算法 回溯算法介绍   回溯算法并不是非常复杂的算法, 很多人接触过但是未必知道这是回溯算法; 典型的回溯算法...

  • 【D20】全排列&N皇后(LC 46&47&51)

    今日主题:回溯。 回溯算法的模板image.png其中,1、路径:也就是已经做出的选择。2、选择列表:也就是你当前...

网友评论

      本文标题:[JS]回溯算法之矩阵中的路径

      本文链接:https://www.haomeiwen.com/subject/bkqnuctx.html