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

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

以及勤劳的自己

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351