算法题每日一练---第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月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
50 1
|
3月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
52 0
|
6天前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
6天前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
3月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
2月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
27 0
|
3月前
|
人工智能 算法 测试技术
【字符串】【C++算法】828.统计子串中的唯一字符
【字符串】【C++算法】828.统计子串中的唯一字符
|
6天前
|
算法
基于模糊控制算法的倒立摆控制系统matlab仿真
本项目构建了一个基于模糊控制算法的倒立摆控制系统,利用MATLAB 2022a实现了从不稳定到稳定状态的转变,并输出了相应的动画和收敛过程。模糊控制器通过对小车位置与摆的角度误差及其变化量进行模糊化处理,依据预设的模糊规则库进行模糊推理并最终去模糊化为精确的控制量,成功地使倒立摆维持在直立位置。该方法无需精确数学模型,适用于处理系统的非线性和不确定性。
基于模糊控制算法的倒立摆控制系统matlab仿真
|
1天前
|
算法 数据安全/隐私保护
基于LS算法的OFDM+QPSK系统信道估计均衡matlab性能仿真
基于MATLAB 2022a的仿真展示了OFDM+QPSK系统中最小二乘(LS)算法的信道估计与均衡效果。OFDM利用多个低速率子载波提高频谱效率,通过循环前缀克服多径衰落。LS算法依据导频符号估计信道参数,进而设计均衡器以恢复数据符号。核心程序实现了OFDM信号处理流程,包括加性高斯白噪声的加入、保护间隔去除、快速傅立叶变换及信道估计与均衡等步骤,并最终计算误码率,验证了算法的有效性。
9 2
|
1天前
|
算法
基于GA-PSO遗传粒子群混合优化算法的CVRP问题求解matlab仿真
本文介绍了一种基于GA-PSO混合优化算法求解带容量限制的车辆路径问题(CVRP)的方法。在MATLAB2022a环境下运行,通过遗传算法的全局搜索与粒子群算法的局部优化能力互补,高效寻找最优解。程序采用自然数编码策略,通过选择、交叉、变异操作及粒子速度和位置更新,不断迭代直至满足终止条件,旨在最小化总行驶距离的同时满足客户需求和车辆载重限制。

热门文章

最新文章