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



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

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

原始问题:

我正在尝试 Leetcode,3。最长的子字符串,不带重复字符。

我可以在 Python 中解决这个问题,为动态编程制作一个 2D 表。

但是在我有点陌生的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;

};

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

我看了这个:如何在 JavaScript 中获取数组的特定索引的值? 但它并没有真正说出任何不同的东西。

//put base case in dict注释之后循环的第一次迭代中,i0.

然后,您正在尝试访问T[i-1][j],这相当于T[-1][j]

由于T没有-1索引,因此T[-1]解析为undefined,您尝试访问索引[j]并得到您看到的错误。

最新更新