滑动窗口——无重复字符最长的字串

题目:

子字符串,我们也可以看成子数组。

题意不难理解,这个题我们暴力枚举的思路是把每一个字符遍历存到hash桶中,如果放两次就进行结果更新。

但这个题我们有更优化的方法,利用数组代替hash(重点不在这!!)。我们用滑动窗口的原理(同向双指针),先让left和right指向头,然后判断right所对应的数组下标是否为1(利用标记来达到桶的效果初始全为0),如果为0则标记为1,right++;如果为大于1,先更新结果,left++,然后right++,这里right不重新回到left再遍历是我们已经能证明二者之间一定无重复字符了。直到right走到尾。

cpp 复制代码
int Solution(string s)
{
     int hash[128]={0};
   int left=0,right=0,n=s.size();
    int ret=0;
  
  while(right<n)
  { 
     
      hash[s[right]]++;
       while(hash[s[right]]>1)
        {
          
          hash[s[left++]]--;
        }
        ret=max(ret,right-left+1);
       right++;
    
   }
  return ret;
}

   

注意一下代码里的第二个while为什么不是if。因为我们要避开那种相同字符连续的情况(比如abbcde)这样的话如果我们使用if就无法实现让重复字符的hash--。即确保[left, right]之间至多有一个相同字符(无论何时)。

相关推荐
Christo3几秒前
TKDE-2026《Efficient Co-Clustering via Bipartite Graph Factorization》
人工智能·算法·机器学习·数据挖掘
2401_838472511 分钟前
C++异常处理最佳实践
开发语言·c++·算法
m0_736919105 分钟前
C++中的类型标签分发
开发语言·c++·算法
2301_7903009611 分钟前
C++与微服务架构
开发语言·c++·算法
重生之我是Java开发战士17 分钟前
【优选算法】前缀和:一二维前缀和,寻找数组的中心下标,除自身以外数组的乘积,和为K的子数组,和可被K整除的子数组,连续数组,矩阵区域和
线性代数·算法·矩阵
梵刹古音20 分钟前
【C语言】 循环结构
c语言·开发语言·算法
皮皮哎哟27 分钟前
冒泡排序与数组传递全解析 一维二维指针数组及二级指针应用指南
c语言·算法·冒泡排序·二维数组·指针数组·传参·二级指针
m0_5613596728 分钟前
C++代码冗余消除
开发语言·c++·算法
近津薪荼39 分钟前
优选算法——滑动窗口1(单调性)
c++·学习·算法
diediedei41 分钟前
嵌入式C++驱动开发
开发语言·c++·算法