猿问

Javascript动态编程表,在某些情况下无法像Python中那样索引2D数组?

实际上这里的逻辑是错误的。我使用 Python3 和一个字典解决了这个问题,该字典更新了看到字母的最后一个索引。在动态规划术语中,它类似于 LIS(最长递增子序列)。


如果有人知道如何在不使用字典的情况下解决这个问题,请发表评论,因为我在学校学过DP,这些课程只使用了数组,所以只用数组就可以了。


原问题:


我正在尝试 Leetcode,3. 没有重复字符的最长子串。


我可以用 Python 制作一个用于动态编程的二维表来解决这个问题。


但在我不太熟悉的 JavaScript 中,我遇到了错误。


evalmachine.<anonymous>:41

                var top = T[i-1][j]

                                ^


TypeError: Cannot read property '1' of undefined

    at lengthOfLongestSubstring (evalmachine.<anonymous>:4

我的代码:


/**

 * @param {string} s

 * @return {number}

 */

var lengthOfLongestSubstring = function(s) {

    //empty string

    if (s.length <= 0){

        return 0

    }

    //initialize dict

    var dict = {};

    //initialize 2D table T

    var T = new Array(s.length)

    for (var i = 0; i<s.length; i++){

        T[i] = new Array(s.length);

    }

    

    //base cases are diagonals

    for (var i = 0; i < T.length; i++){

        for (var j=0; j<T.length; j++){

            if(i==j){

                T[i][j] = 1;

            }

            else{

                T[i][j] = 0;

            }

        }

    }

    //put base case in dict

    //dict[s[0]]=1

    for (var i=0; i < s.length; i++){

        for (var j=i+1; j<s.length; j++){

            var row_char = s.charAt(i);

            var col_char = s.charAt(j);

            if (row_char==col_char){

                T[i][j] = 1;

            }

            else{

                //console.log("j",j,T)

                var left = T[i][j-1]

                console.log(left)

                var top = T[i-1][j] 

                console.log(top)

                var bigger = Math.max(left,top);

                T[i][j] = bigger + 1

            }

        }

    }

    //iterate each row to get max

    var high = Number.MIN_SAFE_INTEGER;

    

    for (var i = 0; i < s.length; i++){

        if(T[i][s.length-1] > high){

            high = T[i][s.length-1];

        } 

    }

    

    return high;

    

};

它让我用 0 和 1 索引的基本情况填充表T[i][j],但然后抱怨这样的索引以获得我不理解的值。


我看了这个:How to get value at a certain index of array In JavaScript? 但它实际上并没有说什么不同。


皈依舞
浏览 111回答 1
1回答

米脂

在循环的第一次迭代中,//put base case in dict注释i是0。然后您尝试访问T[i-1][j],这相当于T[-1][j].因为T没有-1索引,所以T[-1]解析为undefined,您尝试访问索引时[j]会收到所看到的错误。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答