[LeetCode]003-Longest Substring Without Repeating Characters

本文介绍了一种求解字符串中最长无重复字符子串的高效算法。通过设定子串的起始点和结束点,并利用哈希表记录字符位置,实现O(n)的时间复杂度。适用于面试和技术交流。

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

题目:
Given a string, find the length of the longest substring without repeating characters. For example,
the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3.
For “bbbbb” the longest substring is “b”, with the length of 1.

Subscribe to see which companies asked this question

解法:
将最长子串的起始点设为i,结尾点设为j,那最长子串的长度就是j-i,每次循环比较可得出最大值。但是获取一次子串后,i需要移到出现重复的字符的后面一位。比如:”abcabc”,j到第二个a时终止,此时长度为3,下一次的计算则要将i设在第一个a后面(也就是第一个b这个位置)。j的位置只需继续往后移动即可。总的算法复杂的为O(n)+O(n)->O(n)。

class Solution
{
public:
    //O(n) + O(n) -> O(n)
    int lengthOfLongestSubstring(string s)
    {
        int i,j,max_length;//i表示最长子串的初始位置,j表示末尾位置,max_length表示最大长度
        i = 0;
        j=0;
        max_length = 0;
        int n = s.length();//字符串总的长度
        bool exist[256] = {false};//256对应了ASCII表上256个字符
        while(j<n)
        {
            if(exist[s[j]])//如果s[j]的位置的字符在前面已经存在过了
            {
                max_length = max(max_length,j-i); //将当前子串的长度与最大比较,获取最大的长度
                //比较完了,要进行下一轮的子串获取了,在这之前要将之前的子串置为不存在,同时移动子串起始点i,不然一直为0
                //将i移到s[j]这个字符前面与之相同的字符那个位置
                while(s[i]!=s[j])
                {
                    exist[s[i]] = false;
                    i++;
                }
                i++;
                j++;
            }
            else
            {
                exist[s[j]] = true;
                j++;
            }
        }
        max_length = max(max_length,n-i);//如果最后一个子串,没有遇到与之一样的字符,则用n-i,表示最大长。
        return max_length;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值