#3 Longest Substring Without Repeating Characters

本文介绍了一种使用双指针法解决 LeetCode 上的最长无重复字符子串问题的算法,时间复杂度为 O(n),适用于字符串处理场景。

题目链接:https://leetcode.com/problems/longest-substring-without-repeating-characters/


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.


//O(n)时间复杂度。 双指针s,p遍历数组,分别记录不重复子序列的头部和尾部
int lengthOfLongestSubstring(char* s) {
    if(*s == '\0')  
        return 0;
    int maxLen = 1;
    char *p;
    int exist[256] = {};        //标志当前考察子序列所包含的字母
    p = s + 1;
    exist[*s] = 1;
    while(*p) {
        while(*p && !exist[*p]) {   //p遍历数组,直到碰到与s、p之间有重复的字母,同时记录遍历过的字母
            exist[*p] = 1;
            ++p;
        }
        if(p - s > maxLen)  //考察子序列大于记录最大长度,更新最大长度
            maxLen = p - s;
        if(*p == '\0')  
            break;
        while(*s != *p) {   //更新子序列的头部,新头部在与p处字母相同的后面(一直保证s、p之间的字母都不想等)
            exist[*s] = 0;      //把子序列中删去的字母标记重新
            ++s;
        }
        ++s;
        ++p;
    }
    return maxLen;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值