码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode T3 无重复字符的最长子串详解

时间:2019-10-20 12:40:25      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:ref   code   字符串   repeat   abc   示例   bcb   解释   ali   

无重复字符的最长子串

题目描述

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

示例:

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

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

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

详细题解

滑动窗口

滑动窗口实际是一个双端队列,队列中维护一个可行解,遍历时将新的元素从队列右端插入,判断新插入元素之后队列是否依旧是可行解,如果是,则继续,如果不是,则将左端的元素出列,直到队列中的元素成为一个新的可行解。

如何判断队列中的元素是否是一个可行解呢?本题中可以使用一个256元素visit数组来表示当前队列中的元素,当新插入的元素已经存在时,则不是一个可行解。

int lengthOfLongestSubstring(char * s)
{
    bool visit[256] = {0};
    int result = 0;
    int i = 0;
    int j = 0;
    
    if (!s) {
        return 0;
    }
    
    for (i = 0; '\0' != s[i]; i++) {
        if (visit[s[i]]) {
            result = result > i - j ? result : i - j;
            while (j < i) {
                if (s[j] != s[i]) {
                    visit[s[j]] = false;
                    j++;
                } else {
                    j++;
                    break;
                }
            }
        } else {
            visit[s[i]] = true;
        }
    }
    
    result = result > i - j ? result : i - j;
    return result;
}
方法 时间复杂度 空间复杂度 结果 时间 内存
方法 时间复杂度 空间复杂度 结果 时间 内存
滑动窗口 O(n) O(1) 通过 8ms 7.2M

?
?
?
?
?
?

leetcode T3 无重复字符的最长子串详解

标签:ref   code   字符串   repeat   abc   示例   bcb   解释   ali   

原文地址:https://www.cnblogs.com/xiaoxxmu/p/11707206.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!