Показать сообщение отдельно
  #20 (permalink)  
Старый 17.02.2017, 16:26
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Ускорил свой вариант в 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'));

Последний раз редактировалось Alexandroppolus, 17.02.2017 в 16:39.
Ответить с цитированием