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

3.无重复字符的最长子串

时间:2023-05-27 12:44:46浏览次数:27  
标签:子串 字符 int rk ans 移动 最长 指针

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

关键是搞懂什么时候左指针向右移动,右指针向右移动。

左指针一直向右移动,左指针只要移动就移除指向的元素

右指针移动条件:1.没越界 2.指向元素不在Set里面

右指针移动的时候时刻记录Set长度

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 哈希集合,记录每个字符是否出现过
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        int rk = -1, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                // 左指针向右移动一格,移除一个字符
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                // 不断地移动右指针
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            // 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }
}

 

标签:子串,字符,int,rk,ans,移动,最长,指针
From: https://www.cnblogs.com/leehl8016/p/17436568.html

相关文章

  • 字符串常用函数
    count():返回某个字符在字符串中出现的次数replace():替换title():将字符串每个单词首字母转为大写lower():将字符串中大写转小写upper():将字符串中小写转大写字符串序列.split(分割字符,分割次数) # 返回数据个数为分割次数+1:返回的是一个列表哈切片语法:序列[开始位置下标:......
  • 深入理解字符串(附面试题)
    字符串介绍字符串是程序开发当中,使用最频繁的类型之一,有着与基础类型相同的地位,甚至在JVM(Java虚拟机)编译的时候会对字符串做特殊的处理,比如拼加操作可能会被JVM直接合成为一个最终的字符串,从而到达高效运行的目的。1String特性String是标准的不可变类(immutable),对它的任何改......
  • 459.重复的子字符串——学习笔记
    题目:给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。示例1:输入:s="abab"输出:true解释:可由子串"ab"重复两次构成。示例2:输入:s="aba"输出:false示例3:输入:s="abcabcabcabc"输出:true解释:可由子串"abc"重复四次构成。(......
  • 28.找出字符串中第一个匹配项的下标——学习笔记
    题目:给你两个字符串 haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是haystack的一部分,则返回 -1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。第一个......
  • 剑指Offer58-II.左旋转字符串——学习笔记
    题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例1:输入:s="abcdefg",k=2输出:"cdefgab"示例2:输入:s="lrloseum......
  • 8. 字符串转换整数 (atoi)
    请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。......
  • 查找某个字符在字符串中出现的次数
    方法一:利用正则的match方法varstr="heleleoworled";varcount=(str.match(/le/g)||[]).length;console.log(count);方法二:先把要找的字符替换为空,然后用前一个字符串的长度减去后一个字符串的长度,除以要查找的字符串的长度。varstr1="heleleoworled";vartarget="l......
  • 字符串strip方法:只要头尾包含有指定字符序列中的字符就删除
    mystr='\n\tthisisacat\n\r'mystr=mystr.strip()#默认去掉两头的空格、换行符\n,制表符\t、回车符\rprint(mystr)#只要头尾包含有指定字符序列中的字符就删除mystr='1213HelloWord2331'mystr=mystr.strip('123')#strip会把‘123’三个元素中的随便......
  • 指定位置插入字符
    1.问题描述编写程序实现以下功能:在字符串中的所有数字字符前加一个$字符,例如,输入A1B23CD45,输出A$1B$2$3CD$4$52.问题分析用串S拷贝出另一个串T,对T从头到尾扫描,对非数字字符原样写入串S,数字字符先写一个$再写数字字符,最后在S串尾加结束标志。3.程序#include<iostream>using......
  • Problem C: 重载字符的加减法
    HomeWebBoardProblemSetStandingStatusStatisticsProblemC:重载字符的加减法TimeLimit:1Sec  MemoryLimit:128MBSubmit:1895  Solved:1155[Submit][Status][WebBoard]Description定义一个字符类Character,只有一个char类型的数据成员。重载......