算法题每日一练---第67天:无重复字符的最长子串

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

3.png

一、问题描述


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


题目链接:无重复字符的最长子串


二、题目要求


样例 1

输入: s="abcabcbb"输出: 3解释: 因为无重复字符的最长子串是"abc",所以其长度为3


样例 2

输入: s="bbbbb"输出: 1解释: 因为无重复字符的最长子串是"b",所以其长度为1


考察

字符串、滑动窗口
建议用时20~35min


三、问题分析


拿到这一题,首先确定属于字符串的应用,以样例 1为例,我一开始的思路是:

从字符串逐个开始遍历,依次向后寻找以当前字符作为首位的最大子串。

abcabcbb第一位aabc第二位bbca第三位ccab第四位aabc......
最后一位bb

我一开始的想法是哈希表(C++的map计数),如果当前这个字符前面的哈希表里面没有出现,那么字符串长度+1,这个字符哈希表+1。按照上面的步骤,逐步遍历。

43.png

但是这种算法效率也太差了,我们优化一下。

41.png

其实可以把原来的二层循环简化到一层,l r作为双指针分别指向第一个字符,依次向后遍历。

如果r指向字符没出现,将它后一位的下标加入哈希表中,l不变,r++。

如果r指向字符出现,l需要变成上一个出现的字符后一位,这样可以保障[l,r]区间内不存在重复的字符。

可以依照力扣上面的几张图示,帮助理解。


四、编码实现


1.优化前

classSolution {
public:
intlengthOfLongestSubstring(strings) {
inti,j,n=s.size(),ans=0,k=0;//初始化代码map<char,int>m;//哈希表存储for(i=0;i<n;i++)//每一个字符作为起点    {
m.clear();//清空ans=0;//for(j=i;j<n;j++)//向后寻找无重复字符        {
if(m[s[j]]==0)//找到了            {
ans++;//计数m[s[j]]++;//标记            }
else//没找到直接退出break;
        }
k=max(k,ans);//寻找最大值    }
returnk;//输出结果    }
};


2.优化后

classSolution {
public:
intlengthOfLongestSubstring(strings) {
intl,r,n=s.size(),ans=0;//初始化变量map<char,int>m;//哈希表for(l=0,r=0;r<n;r++)//区间移动        {
if(m[s[r]]>0)//当前字符与哈希表里面冲突l=max(l,m[s[r]]);//l移位m[s[r]]=r+1;//哈希表存储下标的后一位ans=max(ans,r-l+1);//求出最大值        }
returnans;//输出结果    }
};

五、测试结果42.png

从964ms->12ms,不优化了,满足了。

相关文章
|
1月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
47 0
|
3月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
3月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
65 0
|
6月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
5月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
59 0
|
6月前
|
人工智能 算法 测试技术
【字符串】【C++算法】828.统计子串中的唯一字符
【字符串】【C++算法】828.统计子串中的唯一字符
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
10天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。