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

博客详细介绍了如何使用滑动窗口解决力扣第3题,即找出字符串中无重复字符的最长子串的长度。通过两个指针i和j,维护一个ASCII值映射数组来跟踪字符出现情况,避免重复。文章指出原始代码存在的问题,并给出修正后的代码,确保在处理重复字符时正确更新子串边界。
摘要由CSDN通过智能技术生成

使用滑动窗口求无重复字符最长子串的长度

整体做题思路:

给定一个字符串,要求找出其中不含有重复字符的最长子串的长度。

在这里插入图片描述

我们选用两个指针i,j的方法来求出最长子串的长度,指针i指向无重复子串的第一个字符,指针j指向无重复子串的最后一个字符。通过i,j指针的不断改变,来计算子串的长度。

首先,定义一个长度为128的空数组map[128]存储ASSCII值来反映某一个字符是否在子串中出现过,i,j指针都指向字符串的开头元素,通过循环,改变j指向的字符,使用空数组map[s[j]]的取值来判断字符在子串中是否出现过。

map[s[j]]==0,表示j指向的字符在子串中没有出现过,则j指针后移,并将map[s[j]]赋值为j+1(原因:当判断出map[s[j]]不为零时,指针i可以直接移动到j+1处,重新计算无重复字符);若map[s[j]]!=0,表示表示j指向的字符在子串中出现过,此时需要将指针i移动到j+1(即map[s[j]]的值)处。直达指针j指向最后一个字符。

原始代码(错误)
#include<string.h>
#include <stdio.h>
void main()
{
   
    char str[100];	  
    int n=0,i=0;
    printf("请输入字符串:"); 
    gets(str);
    n=strlen(str);
    for(i=0;i<n;i++)
    {
   
       printf("%c",str[i]);
    }
    lengthOfLongestSubstring(str);      
}

int lengthOfLongestSubstring(char* s) 
{
   
    int map[128]={
   0};  //定义一个空数组存储ASSCII值来反映某一个字符是否在子串中出现过&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值