【无重复字符的最长字串】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

Problem: 3. 无重复字符的最长子串

1、思路

见到这种题,一般都会想到用双指针标记,而后令一个指针向后走,每走一次让前一个指针遍历一遍走过的路径看一看是否存在相似的量,但这样有些麻烦且大费篇章,使用类哈希表的方法可以更加简便的进行功能实现。

2、解题方法

ASSIC码值我们都知道,本题明确标注了是字符串,所以我们可以用127位的数组来进行标记,同样也是双下标的方法,第一个下标不动处于起始位置,第二个下标向后延申,当遇到重复时,让第一个下标转移到第二个下标的位置,并记录下此时的下标差值,即为不重复的长度。

3、复杂度

时间复杂度:

添加时间复杂度, 示例: O ( n ) O(n) O(n)

空间复杂度:

添加空间复杂度, 示例: O ( 1 ) O(1) O(1)

4、Code

int lengthOfLongestSubstring(char* s) 
{
    int hash[127] = {0};							//依据ASSIC创建127个空间的数组
    int left = 0;									//定义左下标变量
    int right = 0;									//定义右下标变量,并让其和左下标处在同一起始位置
    int max = 0;									//记录最大的不重复字符串长度。
    while(s[right])									//通过循环遍历输入的字符串
    {
        if(hash[s[right]] && left < hash[s[right]])	//判断是否有重复
        {
            left = hash[s[right]];					//进入条件语句即代表有重复,此时将left表示位置
            										//移动至right的位置并重新开始寻找下一个重复
        }
        hash[s[right]] = right + 1;					//让类哈希数组中s[right]所代表的ASSIC码值的下标
        											//位置存储字符所在输入字符串中的位置(right + 1
        											//是为了避免记录时造成冲突,因为类哈希表中的原
        											//数据为0)。
        max = max < (right - left + 1) ? (right - left + 1) : max;
                    								//通过对比左右下表变量的差值来确定最大不重复长度
        right++;				
    }
    return max;//循环完毕直接返回max即可
}

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述




5、结语


  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值