首页 > 其他分享 >每日一练 找无重复字符的最长子串

每日一练 找无重复字符的最长子串

时间:2024-03-30 16:01:41浏览次数:20  
标签:子串 字符 charAt 左窗 int chachong length ans 最长

我们来看下这个题目,我们要统计的是不重复的子串,我们可以使用“滑动窗口法”,其实我们很容易就能想到思路。

我们的左窗代表我们目前遍历的开始,即我们遍历的子串的开头,右窗从左窗开始进行遍历,每次遍历都把当前的字符放入组内,遇到重复则退出计算此时的子串长度,接下来左窗加1继续遍历。在java中,我们可以用hashset来做这种重复筛查。

下面是代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int length = s.length() ;
        int ans = 0 ;
        for(int i = 0 ; i < length ; i++ ){
            Set<Character> chachong = new HashSet<Character>() ;
            int r = i  ;
            chachong.add(s.charAt(i)) ;
            while( r+1 < length && !chachong.contains(s.charAt(r+1))){
                chachong.add(s.charAt(r+1)) ;
                r++ ;
            }
            ans = Math.max(r-i+1 , ans);
        }
        return ans ;
    }
}

思路清晰,但是我们每次滑动左窗都要重新建立我们的hashset,这样显然有些麻烦而且我们的空间复杂度也比较大,那么有什么可以修改的地方呢?

显然,我们可以把整个hashset放在外面,那样我们只需把左窗的字符退出hashset,然后接着右窗遍历就可以了,思路是这样但是实际如何呢?接下来看代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int length = s.length() ;
        int ans = 0 ;
        int r = 0  ;
        Set<Character> chachong = new HashSet<Character>() ;
        for(int i = 0 ; i < length ; i++ ){
            chachong.add(s.charAt(i)) ;
            while( r+1 < length && !chachong.contains(s.charAt(r+1))){
                chachong.add(s.charAt(r+1)) ;
                r++ ;
            }
            ans = Math.max(r-i+1 , ans) ;
            chachong.remove(s.charAt(i)) ;
        }
        return ans ;
    }
}

 实际上我们的运行结果是有问题的:

在此样例中,我们就不能通过。问题出在当我们的右窗无法重置位置,就有可能出现右窗在左窗左边的情况,在这种情况下,我们如何能让右窗重新“归位”,保证右窗与左窗的联系呢?实际上,我们把退出左窗放在下一次循环里,循环中我们开始便退出上一次的左窗,这样的话我们可以发现,我们的右窗会保证跟在左窗后最终实现归位。 

最终代码如下:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int length = s.length() ;
        int ans = 0 ;
        int r = 0  ;
        Set<Character> chachong = new HashSet<Character>() ;
        for(int i = 0 ; i < length ; i++ ){
            chachong.add(s.charAt(i)) ;
            if(i!=0){
                chachong.remove(s.charAt(i-1)) ;
            }
            while( r+1 < length && !chachong.contains(s.charAt(r+1))){
                chachong.add(s.charAt(r+1)) ;
                r++ ;
            }
            ans = Math.max(r-i+1 , ans) ;
        }
        return ans ;
    }
}

 

标签:子串,字符,charAt,左窗,int,chachong,length,ans,最长
From: https://blog.csdn.net/2403_83073833/article/details/137168962

相关文章

  • 11.子串简写
    11.子串简写-蓝桥云课(lanqiao.cn)问题描述程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如internation-alization简写成i18nKubernetes(注意连字符不是字符串的一部分)简写成K8sLangiao简写......
  • 实验报告( 重载,引用,指针,交换,字符串的连接 )
       一、实验目的:掌握函数重载的使用方法深入理解指针的概念,掌握指针的使用方法理解引用的概念,掌握引用作为函数参数的使用方法二、实验仪器或设备:微型计算机三、总体设计(设计原理、设计方案及流程等)实验内容:1、设计一组重载函数add(),至少包括:charadd(char,int);......
  • day01-字符串方法-逻辑运算符规律
    字符串方法 查询类方法 字符串.index(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则报错字符串.find(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则返回-1字符串.rindex(字符):查询指定字符在整个字符串中最后一次出现的......
  • [题解]P1439 【模板】最长公共子序列
    P1439【模板】最长公共子序列题意简述给出\(1,2,…,n\)的两个排列\(P_1\)和\(P_2\),求它们的最长公共子序列。范围限制:\(n\le10^5\)。样例53214512345输出:3。思路简述这道题看似是最长公共子序列,但是发现如果用\(O(n^2)\)的复杂度实现\(LCS\)就会时......
  • toLocaleString 将字符串、日期、数字、数组等对象的本地化
    toLocaleString() 是JavaScript中许多对象(包括 Number、Date 和数组)的一个方法。这个方法返回一个字符串,该字符串表示该对象的本地化版本。这通常意味着它会考虑运行代码的环境的语言和地区设置,来生成一个更易读或更符合当地习惯的字符串表示。对于 Number:当对 Number ......
  • AcWing 799. 最长连续不重复子序列
    原题链接:https://www.acwing.com/problem/content/801/题目分析用数组记录每个元素出现的次数,遍历以第i个元素为结尾的[i,j]区间的最长长度显然[i-1,j]必然达到最大,所以每次重复会发生在新增添的a[i]上,j右移直到到达i和暴力做法的区别就在于指针不会回退代码细节每次先把......
  • 3.29代码任务对基本字符运用学习适合小白
    packageday1.one;publicclassVariableDemo2{publicstaticvoidmain(String[]args){//目标掌握基本数据类型使用//1.byteshortintlongbytea=127;//byteab=128;//越界了只能表示-128到127shorts=132......
  • R语言paste函数、paste0函数将多个输入组合成字符串实战
    R语言paste函数、paste0函数将多个输入组合成字符串实战目录R语言paste函数、paste0函数将多个输入组合成字符串实战#基本语法......
  • 在MySQL中字符串和整数比较的行为
    目录转换规则注意事项最佳实践转换规则  在MySQL中,当进行字符串和整数的比较时,MySQL会尝试将字符串转换为数值来进行比较。这种转换遵循特定的规则:如果字符串的开头部分包含数字,那么MySQL会将这个数字部分提取出来,并将其用作比较的数值。如果字符串以非数字字符开......
  • 统计数字字符和空格
    题目描述本题要求编写程序,输入一行字符,统计其中数字字符、空格和其他字符的个数。建议使用switch语句编写。输入格式输入在一行中给出若干字符,最后一个回车表示输入结束,不算在内。输出格式在一行内按照blank=空格个数,digit=数字字符个数,other=其他字符个数......