Ускорил свой вариант в 10 раз
используется массив вместо объекта для карты последних вхождений.
function maxUniqSubStr(str) {
if (!str) { return ''; }
var map = [];
for (var i = 0; i < 256; ++i) {
map[i] = -1;
}
var maxLength = 1;
var maxStart = 0;
var start = 0;
for (var i = 0, le = str.length; i < le; ++i) {
var c = str.charCodeAt(i);
var pos = map[c];
if (pos >= start) {
if (maxLength < i - start) {
maxStart = start;
maxLength = i - start;
}
start = pos + 1;
}
map[c] = i;
}
if (maxLength < i - start) {
maxStart = start;
maxLength = i - start;
}
return str.substr(maxStart, maxLength);
}
alert(maxUniqSubStr('abcdeahopwunshslge'));