Вы передаете каждый символ или вашу строку в put
, когда видите ее. Затем вы отслеживаете строку так, как она идет, пока не получите первый (k + 1) -й символ в этой строке, и вам нужно решить, какую часть строки отбросить, чтобы оставить только k символов. Когда вы вызываете get
, вы узнаете, какой символ находится ближе всего к началу (т. Е. Выдает, какой символ даст вам самую длинную строку из k + 1 уникальных символов, которые вы можете отслеживать дальше)
https://jsfiddle.net/zyhh4bup/
const str = 'dbaaccaaadbaa'
const k = 3
const cache = {}
const lruPut = (char, index) => cache[char] = index
const lruGet = (char) => cache[char]
var longest = ''
var current = ''
var currentChars = {}
for (var i = 0; i < str.length; i++) {
if (longest.length < current.length) {
longest = current
}
currentChars[str[i]] = true;
current += str[i];
lruPut(str[i], i)
if (Object.keys(currentChars).length > k ) {
// we have to interrupt the sequence and start a new one
// new sequence is started from the furtherst character
var positions = Object.keys(currentChars).map(char => lruGet(char))
var position = Math.min.apply(null, positions)
// cutting the current sequence to remove first (k + 1)-th character
var current = str.slice(position + 1, i + 1)
delete currentChars [str[position]]
}
}
console.log(longest)