现在我已经自己解决了这个算法挑战,但我希望有人能逐行解释下面的答案,就像我从别人那里拿到的一样。我完全不明白它和答案是怎么来的,即使在使用pythonTutor之后也是如此。
挑战:
编写一个名为findLongestSubstring的函数,该函数接受一个字符串并返回包含所有不同字符的最长子字符串的长度。编辑:我只是不理解上面的代码。
function findLongestSubstring(str) {
let longest = 0;
let seen = {};
let start = 0;
for (let i = 0; i < str.length; i++) {
let char = str[i];
if (seen[char]) {
start = Math.max(start, seen[char]);
}
// index - beginning of substring + 1 (to include current in count)
longest = Math.max(longest, i - start + 1);
// store the index of the next char so as to not double count
seen[char] = i + 1;
}
return longest;
}
// findLongestSubstring("thisisawesome"); // 6
// findLongestSubstring("thecatinthehat"); // 7我的解决方案是:
function findLongestSubstring(str){
if (str.length === 0) return 0;
// track longest length
let longestLength;
// get first subArr
let subStrArr = str.split("").slice(0,1);
// get first subArrLength
let subStrLength = subStrArr.length;
longestLength = subStrLength;
// variable for checking every character
let j = 0;
// for loop
for ( let i = 1; i < str.length; i++ ) {
// if current element don't exist in subArr
if (!subStrArr.includes(str[i])) {
subStrArr = str.split("").slice(j,i+1);
subStrLength = subStrArr.length;
}
// does exist
else {
j++;
i = j;
subStrArr = str.split("").slice(i,i+1);
subStrLength = subStrArr.length;
}
if (subStrLength > longestLength) longestLength = subStrLength;
}
return longestLength;
}
findLongestSubstring("rithmschool"); // 7发布于 2021-11-14 13:49:34
具有唯一字符的子字符串显然没有重复的字母。因此,当我们在字符串str中前进时,我们跟踪我们已经在seen中遇到的所有字符中最大的索引。每个字母的最大索引显然是我们从左到右移动后最后看到的索引。
现在,在迭代中,当到达在seen中找到的字母时,需要将start设置为seen跟踪的该字符的索引,以避免在子字符串中同时包含这两个字母。我们采用max是因为substring的start可能已经更高了,因为我们之前遇到了另一个双字母:
if (seen[char]) {
start = Math.max(start, seen[char]);
}然后,我们只需查看当前的子串有多长,如果它比我们看到的最长的子串长,就保留它。
longest = Math.max(longest, i - start + 1);最后将字符的索引保存在seen中
seen[char] = i + 1;这些操作的顺序很重要。如果我们首先用字符的索引更新seen,那么我们就不能检查字符的seen并根据它设置start。
https://stackoverflow.com/questions/69962846
复制相似问题