LeetCode-Longest Substring Without Repeating Characters(JS题解)

Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"
Output: 3 
Explanation: The answer is "abc", with the length of 3. 
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:

Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3. 
             Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

本题要求计算出字符串中最长不重复子串的长度。值得注意的是,需要考虑字符串为空,或空格的情况。

最简单的方法:
for循环遍历最容易理解,然而效率非常低下,只有16%的超越率

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    const len=s.length;
    if(!len){return 0};
    let sum=1;
    for(let i=0;i<len;i++){
        const array=[];
        let temp=0;
        for(let j=i;j<len;j++){
            if(array.indexOf(s[j])==-1){
                temp++;
                array.push(s[j]);
            }else{
                break;
            }
        }
        sum=temp>sum?temp:sum;
    }
    return sum;
};

哈希表:
ES6支持Map集合,所以可尝试使用哈希表求解减少查找时间,通过后有36%的超越率。

/** 
 * TestCase: [' ','','au','abba']
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let sum=0;
    const map=new Map();
    for(let i=0,firstIndex=0,len=s.length;i<len;i++){
        //获得最先重复字符的位置,如'abba',遍历到a,则重复字符的位置为2
        if(map.has(s[i])){
            firstIndex=firstIndex>map.get(s[i])?firstIndex:map.get(s[i]);
        }
        //最大长度赋值
        //根据最后重复字符的位置,计算重复子串的间隔(i-lastIndex+1)
       // 加1是因为数组从0开始,如'au' 
        sum=(i-firstIndex+1)>sum?(i-firstIndex+1):sum;
        //以1开始计数
        map.set(s[i],i+1);
    }
    return sum;
};

猜你喜欢

转载自blog.csdn.net/qq_32013641/article/details/86603378
今日推荐