【LeetCode 中等题】2-无重复字符的最长子串

声明:

今天是中等题第2道题。给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除

(手动比心ღ( ´・ᴗ・` ))

正文

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

示例 1:

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

示例 2:

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

示例 3:

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

解法1。首先第一想到的是暴力法,就是穷举所有可能性,并在每一步都选择是否要更新最大长度,但这种做法时间复杂度高,为O(n^{3}),所以选择用滑动窗口的方法,基本思路就是固定下i,j逐渐往后走,长度更新为j-i,直到遇到重复的元素,删掉第i个元素(这个元素就是重复的),然后i+1,j继续往后走,该方法时间复杂度为O(n^{2})代码如下。

执行用时: 136 ms, 在Longest Substring Without Repeating Characters的Python3提交中击败了58.50% 的用户

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return None
        i,j = 0,0
        len_s = len(s)
        string = set()
        max_len = 0
        while i < len_s and j < len(s):
            if s[j] not in string:
                string.add(s[j])
                j += 1
                max_len = max(max_len,j-i)
            else:
                string.remove(s[i])
                i += 1
        return max_len

 解法2。上一种解法的优化思路,主要区别是存储最长字符串的容器由集合set改为字典dict,并且在j移动过程中不删除元素,只更新i值,并用j-i+1作为当前的子串长度和上一轮最长长度相比较来更新最长长度,代码如下。

执行用时: 144 ms, 在Longest Substring Without Repeating Characters的Python3提交中击败了51.59% 的用户

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        i,j = 0,0
        string = {}
        len_s = len(s)
        max_len = 0
        while i < len_s and j < len_s:
            if s[j] in string:
                i = max(string.get(s[j],0),i)
            max_len = max(max_len, j-i+1)
            string[s[j]] = j+1
            j += 1
        return max_len

结尾

解法1&解法2:官方解法

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/84530112
今日推荐