python刷题3——LeetCode无重复字符的最长子串

LeetCode刷题

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

示例 1:

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

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

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

python刷题3——LeetCode无重复字符的最长子串_第1张图片
首先是最简单易懂的遍历大法:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        length = len(s)

        if length <= 1:
        	return length

        max_length = 0
        for i in range(length):
            data = s[i]
            for j in range(i + 1, length):
                if s[j] not in data:
                    data = data + s[j]
                else:
                    break
            max_length = max(max_length, len(data))

        return max_length

虽然确实简单易懂,但是从时间复杂度上来看,很有可能会超时。

下面是提交情况:
python刷题3——LeetCode无重复字符的最长子串_第2张图片
离谱哈哈,所以这次我们考虑用哈希表的方法来解决:

直接上代码:

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        length = len(s)
        if length <= 1:
            return length
        head, max_length = 0, 0
        myHashMap = {}
        for index in range(length):
            if s[index] in myHashMap and head <= myHashMap[s[index]]:
                head = myHashMap[s[index]] + 1
            else:
                max_length = max(max_length, index - head + 1)
            myHashMap[s[index]] = index
        return max_length

下面是提交结果:
python刷题3——LeetCode无重复字符的最长子串_第3张图片

结束语

由于博主能力有限,博文中提及的信息,也难免会有疏漏之处。希望发现疏漏的朋友能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的方法也请不吝赐教。

如果有什么相关的问题,也可以关注评论留下自己的问题,我会尽量及时发送!

然后如果这些内容对你有所帮助的话,麻烦点赞或者评论告诉我可以吗(这样我更新博客的速度才会越来越快!!!)

你可能感兴趣的:(python刷题)