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

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

时间:2023-12-16 17:44:44浏览次数:26  
标签:子串 字符 ret us ans 长度 最长

1.题目介绍

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

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • \(0 <= s.length <= 5 * 10^{4}\)
  • \(s\) 由英文字母、数字、符号和空格组成

2.题解

2.1 滑动窗口

思路

这里的核心思路是为何不需要回溯?
我每次起始位置向后移动一个,这时候就面临需不需要回溯的问题,但是注意这里实际包含的字母是比之前少一个,
之前成立的现在必定成立,之前不成立的由于去掉的首位字母有可能实现,这就说明不需要回溯,是滑动窗口算法实现的理论基础
这里使用了底层是哈希表的集合来存储出现的各位字母,然后利用滑动窗口不断判断记录最大长度。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<int> us;
        int ret = 0, ans = 0;    
        for (int i = 0; i < s.length(); i++){
            if (i != 0) us.erase(s[i-1]);
            while (!us.count(s[ret])){
                us.insert(s[ret]);
                if (ret != s.length() - 1) ret++;
                else return max(ans, ret - i + 1); //注意本来算长度就应该是距离+1,但是之前ret++多加了一个,所以后面直接用的ret-i,这里并没有使用加法,所以需要+1
            }
            ans = max(ans, ret - i);
        }
        return ans;
    }
};

标签:子串,字符,ret,us,ans,长度,最长
From: https://www.cnblogs.com/trmbh12/p/17905099.html

相关文章

  • Java 字符串、数组、ArrayList转换
    Java字符串、数组、ArrayList之间的相互转换 数组转字符串importjava.util.Arrays;publicclassTest02{publicstaticvoidmain(String[]args){int[]scores1=newint[]{10,20,30,40,50};int[]scores2={10,20,30,40,50};//数......
  • string.replace()与removeprefix() 和 removesuffix()的区别 字符串技巧
    string.replace(),removeprefix()和removesuffix()是Python中的字符串方法,它们都用于修改字符串,但是它们的功能和使用方式有所不同:string.replace(old,new[,count]):这个方法会将字符串中的old子串替换为new子串。如果提供了可选参数count,则只替换前count个old子串¹......
  • P2516 [HAOI2010] 最长公共子序列
    求方案数,直接从\(f[i-1][j]\)和\(f[i][j-1]\)转移过来,如果\(s1[i]==s2[j]\)就加上\(f[i-1][j-1]\),如果\(s1[i]!=s2[j]\)且\(f[i][j]==f[i-1][j-1]\)说明两边转移到了\(f[i-1][j-1]\),减去重复部分\(f[i-1][j-1]\)就行了。比较好的理解方式是画个网格图,如果\(s1[......
  • 字符串基础
    字符串常用操作定义字符串时,单引号,双引号,三引号都可以 字符串拼接#字符串拼接s1='i's2='love's3='you's4=s1+''+s2+''+s3print(s4)s4=f'{s1}{s2}{s3}'print(s4)字符串切片对于字符串里的每个字符都有特定的位置索引s='testfan'从上......
  • 哈希表(HashMap)与字符串哈希
    哈希表哈希表是一种通过映射来快速查找的数据结构。其通过键值对(key-value)来存储。一个数据通过哈希函数的运算来生成一个属于他自己的键值,尔后将其与键值绑定。当我们想查找这个数据时,就可以直接通过键来访问对应的值,时间复杂度近似为O(1)。哈希表适用于这样一种场景,当数据......
  • 解决方案 | pywintypes.com_error: (-2147221005, '无效的类字符串', None, None) --P
     1背景importpythoncomimportwin32com.clientimportmathwincad=win32com.client.Dispatch("AutoCAD.Application")#强制打开cad,该句发生报错信息doc=wincad.ActiveDocumentdoc.Utility.Prompt("Hello!Autocadfrompywin32com.\n")msp=doc.Mode......
  • 【kmp算法】字符串匹配
    一,解决问题kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[]中匹配模式串p[],找到匹配到的位置loc;二,具体实现和演变过程最自然的想法是暴力写法(BF)枚举主串字符s[i],和模式串p[j]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次进行比较,......
  • C#根据类的Name字符串找到类
    C#中根据类的名称字符串创建类的实例这种⽤法很像是⼯⼚类,但是我们不需要⾃⼰实现字符串到类型的对应关系,也不需要创建的类有继承关系,代码如下://第⼀步:得到类的全名(命名空间+类名)stringadaptorName=namespace+classname;//第⼆部:根据全名得到类的类型TypeadaptorType......
  • Access数据库的中长字符串字段
    CREATETABLEoauth2_registered_client(idvarchar(36)NOTNULL,client_idvarchar(64)NOTNULL,client_id_issued_attimestampNOTNULL,client_secretvarchar(255)NULL,client_secret_expires_attimestampNULL,client_namevarchar......
  • shell补-特殊玩法-生成随机字符串
    shell补-特殊玩法-生成随机字符串方法1:md5sum方法2:tr+/dev/urandom方法3:内置变量RANDOM;#方法1[root@localhostser]#opensslrand-base64108/54arQpCmQ12Q==[root@localhostser]##方法2必备[root@localhostser]#date+%N|md5sum###给日期加密;可以写其......