LeetCode-3.无重复字符的最长子串 利用一个整形数组+ASCII码实现滑动窗口

简介: 题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 :
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

分析如下
方案一:从头到尾用两层循环比对字符,时间复杂度O(n²),不推荐
方案二:我想到了利用一个整形数组,下标对应字符的ASCII码,然后值存字符最新出现的数组位置。
这里我用len代表当前累计长度,i为字符在字符数组中的位置,tag为当前子串的起始位置。这样做只需对该字符数组进行一次遍历,时间复杂度为O(n)。

c语言解法如下

int lengthOfLongestSubstring(char * s){
    //常用字符ASCII码范围是0~128,开150的数组绰绰有余
    int tem[150]={0};
    int len = 0,i=1,result=0,tag=0;
    while(*s != '\0'){
        int a = s[0];
        if(tem[a]==NULL || tem[a]<tag){
            tem[a] = i; //标记该字符存在的最新位置
            len++;
        }else{
            result=len>result?len:result;
            tag=tem[a];
            len=i-tag-1;
            tem[a]=NULL;
            continue;
        }
        s++;
        i++;
    }
    return len>result?len:result;
}

最后提交结果如下,可以看到算法还可以继续进行优化:
执行用时:
4 ms, 在所有 C 提交中击败了84.91%的用户
内存消耗:
5.5 MB, 在所有 C 提交中击败了100.00%的用户

目录
相关文章
|
1月前
【LeetCode 26】239.滑动窗口最大值
【LeetCode 26】239.滑动窗口最大值
31 1
|
1月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
65 0
Leetcode第三题(无重复字符的最长子串)
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
3月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
1月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
19 4
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
18 0
Leetcode第三十三题(搜索旋转排序数组)
|
1月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
56 0
|
1月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
16 0
|
1月前
【LeetCode 04】滑动窗口法总结
【LeetCode 04】滑动窗口法总结
17 0
|
3月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II