首页 > 其他分享 >leetcode 3 无重复字符最长串

leetcode 3 无重复字符最长串

时间:2024-08-31 12:36:30浏览次数:11  
标签:字符 边界 temp max 复杂度 最长 字符串 leetcode

leetcode 3 无重复字符最长串

image-20240831122601492

思路

使用滑动窗口,建两个整型变量lp和rp,分别代表左边界指针和右边界指针,整型temp储存当前字串长度,整形max储存当前最长长度,然后从左往右遍历字符串。

解题过程

先将字符串toCharArray转成字符数组m,建一个哈希集合,储存当前已经用过的字符,然后写一个while循环,在循环中主要进行两步操作: 1.如果右边界字符在哈希集合中已经存在,说明这个左边界已经讨论结束,lp++,然后将m[lp]从集合中移除掉,temp--。 2.如果右边界字符在哈希集合中不存在,那么将m[rp]加入集合,temp++,max=Math.max(max,temp)。 同时需要注意进行while循环需要一定的条件,即字符串不为空(如果是空字符串chars.add(m[0])会报错)。 并且这里判断字符串不为空要用isEmpty()函数,而不能用length>0(如果字符串里全是空格占位符,那length也是0)

复杂度

  • 时间复杂度: O(n)

分析:左右边界都在动,且while循环边界条件是右边界到头。那么最坏情况下,右边界一直动,并且左边界一直跟着动到右边界左侧与其相邻,且HashSet的contains,remove,add复杂度都是o(1),因此总复杂度为O(2n)*O(1),即复杂度为O(n)。

class Solution {
       public int lengthOfLongestSubstring(String s) {
        int lp=0,rp=1,max=1,temp=1;
        HashSet<Character> chars = new HashSet<Character>();
        char[] m=s.toCharArray();
        int len=m.length;
        if(s.isEmpty()==false){
            chars.add(m[0]);
            while (rp<len){
                if(chars.contains(m[rp])){
                    chars.remove(m[lp]);
                    lp++;
                    temp--;
                }
                else {
                    chars.add(m[rp]);
                    rp++;
                    temp++;
                    max=Math.max(max,temp);
                }
            }
            return max;
        }
        else return 0;
    }
}

标签:字符,边界,temp,max,复杂度,最长,字符串,leetcode
From: https://www.cnblogs.com/vastjoy/p/18390123

相关文章

  • 代码随想录day46 || 647 回文子串, 516 最长回文子序列
    647回文字串funccountSubstrings(sstring)int{ //动规五部曲 //dp[i][j]表示s[i:j+1]区间是否是一个回文 //ifs[i]==s[j]{ifi-j<=1||dp[i+1][j-1]==true{dp[i][j]==true}} //初始化为false //从下往上,从左往右 //print varcountint var......
  • LeetCode题集-1- 两数之和
      这个题目是什么意思呢?简单来说就是在一个数组中找出两个元素,使其和为我们设定的值,并且每个元素只能用一次。 如下图具体示例: 到这里不知道你是否已经有解题思路了呢?解法一:双层循环我第一反应就是双层循环,直接暴力破解。因为题目要求每个元素只能使用一次,并且已经计......
  • LeetCode 热题 100 回顾
    目录一、哈希部分1.两数之和 (简单)2.字母异位词分组 (中等)3.最长连续序列 (中等)二、双指针部分4.移动零 (简单)5.盛最多水的容器 (中等)6. 三数之和 (中等)7.接雨水 (困难)三、滑动窗口8.无重复字符的最长子串 (中等)9.找到字符串中所有字母异位词 (中等)四、子串10.......
  • 字符串的处理
    消除换行符if(str[i]=='\n')str[i]='\0';scanf和cin会读取空格,而fgets不会gets_s许多编译器不支持,不建议用charstr[N]; if(fgets(str,sizeof(str),stdin)==NULL) { return1; }格式化输入输出sprintf:功能:sprintf用于将格式化的数据输出到一个字符串......
  • 738. 单调递增的数字(leetcode)
    https://leetcode.cn/problems/monotone-increasing-digits/description/classSolution{publicintmonotoneIncreasingDigits(intn){//返回单调递增的最大数字//思路比较巧妙的贪心题,需要仔细考虑两个相邻位之间的比较//一旦发现有前一......
  • Leetcode 第 408 场周赛题解
    Leetcode第408场周赛题解Leetcode第408场周赛题解题目1:3232.判断是否可以赢得数字游戏思路代码复杂度分析题目2:3233.统计不是特殊数字的数字数量思路代码复杂度分析题目3:3234.统计1显著的字符串的数量思路代码复杂度分析题目4:3235.判断矩形的两个角落是否......
  • 5_最长回文子串
    5_最长回文子串【问题描述】给你一个字符串s,找到s中最长的回文子串。示例:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。【算法设计思想】本题主要使用到了动态规划的算法思想。其程序的大致执行过程如下:首先,我们先求取下该字符串的长度,然后判断下这个字......
  • sha-256算法,生成固定长度的字符串
    SHA-256(安全哈希算法256位)是一种广泛使用的加密哈希函数,它会将输入的任意大小的数据转换为固定长度的256位(32字节)哈希值。SHA-256是SHA-2系列算法的一部分,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布。SHA-256的主要特点包括:固定长度输出:无论输入数据的......
  • JavaScript 的模板字符串
    字符串插值JavaScript中使用反引号`包裹的字符串叫模板字符串(templateliterals)。人们常用它拼接变量和字符串,即所谓的字符串插值(stringinterpolation)。在使用字符串插值时,使用${}包裹变量或表达式,它是变量的占位符。多行文本模板字符串支持多行文本(multi-linestr......
  • 关于java输入字符串的一些问题
    最近自学java,学到了Scanner类这块,我想着测试一下输入,遇到了个问题,我想要输入两个字符串,但是我输入一个字符串后程序就停止运行了,有点疑惑,我的代码如下s1=scan.next();System.out.print(s1);s2=scan.nextLine();System.out.print(s2);结果就是只能输出s1,然后我就想起来这......