算法题每日一练---第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,不优化了,满足了。

相关文章
|
3月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
58 0
|
5月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
5月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
3月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
149 0
|
8月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
7月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
94 0
|
8月前
|
人工智能 算法 测试技术
【字符串】【C++算法】828.统计子串中的唯一字符
【字符串】【C++算法】828.统计子串中的唯一字符
|
3天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
3天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
|
13天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。

热门文章

最新文章