LeetCode--最长不含重复字符的子字符串

熵桥流沙
• 阅读 1901

LeetCode--最长不含重复字符的子字符串

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

说明

leetcode题,面试48

最长不含重复字符的子字符串

题目

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

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

示例 2:

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

示例 3:

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

Go语言

思路

遍历字符串,使用map记录重复元素出现的位置,对比子串的长度,发现最长的及时更新

代码

func lengthOfLongestSubstring(s string) int {
    //创建一个map集合
    lastOccured := make(map[byte]int)
    //计数器
    startI := 0
    //长度
    maxLength := 0

    //遍历string
    for i, ch := range []byte(s) {
        //判断集合不为空
        if lastI, ok := lastOccured[ch]; ok && lastI >= startI {
            startI = lastI + 1
        }
        //计算最长的子串
        if i-startI+1 > maxLength {
            maxLength = i - startI + 1
        }
        //记录最后一次出现的位置
        lastOccured[ch] = i
    }
    return maxLength
}

Python语言

思路一(滑动窗口)

  • 初始化头尾指针 head,tail;
  • tail 指针右移,判断 tail 指向的元素是否在 [head:tail] 的窗口内;

    • 如果窗口中没有该元素,则将该元素加入窗口,同时更新窗口长度最大值,tail 指针继续右移;
    • 如果窗口中存在该元素,则将 head 指针右移,直到窗口中不包含该元素。
  • 返回窗口长度的最大值。

代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        head = 0
        tail = 0
        # 判断是否为边界
        if len(s) < 2:
            return len(s)
        # 两个指针停留在第一个元素的位置,初始长度为1
        res = 1
        while tail < len(s) - 1:
            tail += 1
            if s[tail] not in s[head:tail]:
                res = max(tail-head + 1,res)
            else:
                while s[tail] in s[head:tail]:
                    head += 1
        return res

思路二(哈希表)

  • tail 指针向末尾方向移动;
  • 如果尾指针指向的元素存在于哈希表中:

    • head 指针跳跃到重复字符的左边一位;
  • 更新哈希表和窗口长度。

代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        hashmap = {}
        head,res = 0,0
        for tail in range(n):
            # 如果说尾指针存在哈希表中,把头指针跳转到开始重复元素的上一位
            if s[tail] in hashmap:
                head = max(hashmap[s[tail]],head)
            # 更新哈希表
            hashmap[s[tail]] = tail +1
            # 更新长度
            res = max(res,tail-head+1)
        return res

C++

  • r 指针向末尾方向移动;
  • 如果尾指针指向的元素存在于哈希表中:

    • l 指针跳跃到重复字符的左边一位;
  • 更新哈希表和窗口长度(时刻返回最大的值)。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char,int> m;
        int ret = 0,l = 0, r=0;
        while(r<s.size()){
              //判断边界
            if(m.find(s[r]) != m.end()){
                l = max(l,m[s[r]]+1);
            }
            m[s[r++]] = r;
            ret = max(r-l,ret);
        }
        return ret;
    }
};

C语言

思路

滑动窗口

代码

int lengthOfLongestSubstring(char* s){
    int count[95]; // ASCII中存在95个可打印的字符,记录遍历s时遇到的字符
    memset(count, 0, 95 * sizeof(int)); // 将count的值全部置为0
    int max_lenght = 0; // 不含重复字符的子字符串的最大长度
    int temp = 0; // 存储遍历s时所寻找到的不含重复字符的子字符串的长度
    int p1 = 0, p2 = 0;
    while(s[p1] != '\0' && s[p2] != '\0'){

        if(count[s[p2] - ' '] == 0){ // 没有遇到重复字符
            count[s[p2] - ' '] = 1; // 记录遇到的字符
            p2 += 1;
            temp = p2 - p1;
        }
        else{ // 遇到重复字符
            temp = p2 - p1;
            count[s[p1] - ' '] = 0; // 删除对p1位置字符的记录
            p1 += 1; // p1右移
        }

        if(temp > max_lenght){
            max_lenght = temp;
        }
    }
    return max_lenght;
}

感谢

leetcode

以及勤劳的自己

点赞
收藏
评论区
推荐文章
一只编程熊 一只编程熊
4年前
【LeetCode每日一题 Day 5】5. 最长回文子串
大家好,我是编程熊,今天是LeetCode每日一题的第五天,一起学习LeetCode第五题《最长回文子串》。题意给你一个字符串s,找到s中最长的回文子串。示例txt输入:s"babad"输出:"bab"解释:"aba"同样是符合题意的答案。题解方法一采用简单暴力的方法,枚举每一个位置为单独回文中心(长度为奇数的子串,如aba)或者回文中心
Easter79 Easter79
3年前
str字符串 count( ) 方法
描述Pythoncount()方法用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。语法count()方法语法:str.count(sub,start0,endlen(string))参数sub搜索的子字符串start字符串开始搜索的位置
Stella981 Stella981
3年前
HDU 2594(求最长公共前后缀 kmp)
题意是在所给的两个字符串中找最长的公共前后缀,即第一个字符串前缀和第二个字符串后缀的最长相等串。思路是将两个字符串拼接在一起,然后直接套用kmp算法即可。要注意用next会报编译错误,改成Next才过……但next确实不是c关键字。代码如下:!(https://oscimg.oschina.net/oscnet/5
Wesley13 Wesley13
3年前
CTF
CTFPwn\BJDCTF2nd\r2t4博客说明文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!CTP平台网址https://buuoj.cn/cha
Stella981 Stella981
3年前
LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
459\.重复的子字符串459\.RepeatedSubstringPattern题目描述给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。<spanclass"badgebadgepillbadgedanger"LeetCod
Stella981 Stella981
3年前
Electron整合React使用搭建开发环境
Electron整合React使用搭建开发环境博客说明文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!简介用于构建用户界面的JavaScript库步骤首先创建React
Wesley13 Wesley13
3年前
MySQL 笔记整理(11)
笔记记录自林晓斌(丁奇)老师的《MySQL实战45讲》(本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除)11)怎么给字符串字段加索引?  日常工作中的登录系统,你很可能会使用emai这个字段。因此也很容易遇到类似这样的语句:mysqlselectfromuserwhereemail'xxx';  
Stella981 Stella981
3年前
LeetCode.1170
这是小川的第412次更新,第444篇原创<br/看题和准备今天介绍的是LeetCode算法题中Easy级别的第263题(顺位题号是1170)。在一个非空字符串s上定义一个函数f(s),该函数计算s中最小字符的出现频率。例如,如果s"dcce",则f(s)2,因为最
Stella981 Stella981
3年前
LeetCode:(14. 最长公共前缀!!!!!)
题目:14\.最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串“”。示例1:输入:\“flower”,“flow”,“flight”\输出:“fl”示例2:输入:\“dog”,“racecar”,“car”\输出:“”
Stella981 Stella981
3年前
LeetCode459. 重复的子字符串
1.问题描述给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例1:输入:“abab”输出:True解释:可由子字符串“ab”重复两次构成。示例2:输入:“aba”输出:Fal
Stella981 Stella981
3年前
Leetcode 424.替换后的最长重复字符
替换后的最长重复字符给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 _k_次。在执行上述操作后,找到包含重复字母的最长子串的长度。注意:字符串长度和_k_不会超过 104。示例1:输入:s"ABAB",k2输