【C语言】无重复字符的最长子串

力扣题目链接

3. 无重复字符的最长子串 - 力扣(LeetCode)

题目描述

给定一个字符串s,请你找出其中不含有重复字符串的最长字串的长度。

解题思路

滑动窗口:将右边界向右滑动,若出现重复字符,则将左边界(多次)向右滑动至剔除重复字符,再重复上述步骤将右边界向右滑动至字符串结束。

以字符串 abcba 为例

left=0 right=0,子串 a,hash['a']=1,右移right

left=0 right=1,子串 ab,hash['a']=1,hash['b']=1,右移right

left=0 right=2,子串 abc,hash['a']=1,hash['b']=1,hash['c']=1,右移right

left=0 right=3,子串 abcb,hash['a']=1,hash['b']=1,hash['c']=1,出现重复字符b,右移left,将hash['a']置0

left=1 right=3,子串 bcb,hash['b']=1,hash['c']=1,仍存在重复字符b,右移left,将hash['b']置0

left=2 right=3,子串 cb,hash['c']=1,hash['b']=1,无重复字符,成功将 b 添加至子串,右移right

left=2 right=4,子串 cba,hash['c']=1,hash['b']=1,hash['a']=1,结束

代码

int lengthOfLongestSubstring(char* s) {
    int hash[128] = {0};    //用于标记当前子串中的字符
    int left = 0;    //左边界
    int right = 0;   //又边界
    int len = strlen(s);
    int max = 0;    //总长
    for(right = 0; right < len; right++){
        while(hash[s[right]] == 1){
            hash[s[left++]] = 0;
        }
         hash[s[right]] = 1;
        if(max < right - left + 1){
            max = right - left + 1;
        }        
    }
    return max;
}

相关知识点

滑动窗口

滑动窗口讲解(c基础)_滑动窗口如何确定起始和停止的位置-优快云博客

哈希表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值