力扣 3无重复字符的最长子串

这篇博客探讨了两种解决寻找字符串中无重复字符的最长子串的方法:滑动窗口和哈希映射。在滑动窗口方法中,通过左右边界动态调整来寻找不重复的子串,遇到重复字符时更新窗口位置。而在哈希映射方法中,使用数组记录字符出现次数,当出现重复时缩小窗口。这两种高效算法能有效处理字符串并找出最长无重复字符子串。
摘要由CSDN通过智能技术生成

3无重复字符的最长子串

思路一 滑动窗口

1.左边界和右边界从字符串的首地址开始
2.右边界向右扩大,每扩大一位遍历窗口内的字符。不重复则更新长度。
3.当发现要纳入窗口中的字符(*right)与窗口内字符重复,则将左窗口移动至窗口内与之重复字符的下一位,剔除掉重复字符。
4.重复之前步骤。

tips:相同类型的指针做加减,以步长为基本单位

int lengthOfLongestSubstring(char * s){

   //if(*s==0) return 0;
    //if(*s==' ') return 1;
    char*head=s;
    char*cur=s;
    int max=0;
    while(*cur)
    {
        for(char*p=head;p<cur;p++)//用指针来遍历窗口内的字母,每次从left开始
        {
            if(*p==*cur)
            {
                head=p+1;
                break;//找到重复字符,重新规划窗口
            }
        }
        max=(cur-head+1)>max?(cur-head+1):max;
        ++cur;
    }
    return max;

}

思路二 哈希加滑动窗口

定义一个数组arr,大小为z的ascii值加1,这样便可以容纳所有字母。
与上面一样的思路,不过思路一是用指针遍历窗口来判断是否有重复。哈希则是用映射来判断。利用字母的ascII值来映射,比如a,出现一次则将arr[a]加一,出现两次则代表重复,需要剔除!

int lengthOfLongestSubstring(char * s){
    int len=strlen(s);
    if(len<1) return len;
    int left,right,max=0;
    int arr[128]={0};
    for(left=0,right=0;right<len;right++)
    {
        arr[s[right]]++;//字母出现一次就+1,也就是窗口内字母数量加1
        while(arr[s[right]]>1)//当出现两次以上,则剔除
        {
            arr[s[left]]--;//左窗口缩小前,使左窗口字母出现的次数-1
            left++;//左窗口缩小
        }
        max=fmax(max,right-left+1);
    }
    return max;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值