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

本文探讨了如何在给定的字符串中找到最长的无重复字符子串,并提供了两种算法实现,包括简单的for循环遍历和更高效的哈希表方法。通过对abcabcbb、bbbbb和pwwkew等示例的解析,展示了不同方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值