【LeetCode】3.Longest Substring Without Repeating Characters(Python)

Problem

给定一个字符串,找到最长子字符串的长度而不重复字符。

例1:
输入:“abcabcbb”
输出:3
说明:答案是"abc",长度为3。

例2:
输入:“BBBBB”
输出:1
说明:牛逼,他的回答是"b",长度为1。

例3:
输入:“pwwkew”
输出:3
说明:答案是"wke",长度为3.
注意答案必须是子字符串,"pwke"是子序列而不是子字符串。

Algorithmic thinking

解法一:算法思路:遍历字符串,获取最长子串的首尾索引即可


Python code 01

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:

Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:

Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
             Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
"""


class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        算法思路:遍历字符串,获取最长子串的首尾索引即可
        :param s: str
        :return: int
        """
        idx, n, start, res = [0] * 128, len(s), 0, 0
        for i in range(n):
            start = max(start, idx[ord(s[i])])     # 子串起始索引
            res = max(res, i - start + 1)          # 子串长度
            idx[ord(s[i])] = i + 1
        return res


if __name__ == '__main__':
    _s = 'Longest Substring Without Repeating Characters'
    s = 'test my string.'
    result = Solution().lengthOfLongestSubstring(s)
    print(result)


Python code 2

借助collection的deque

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        from collections import deque
        
        Q = deque()
        res = 0
        
        for c in s:
            if c not in Q:
                Q.append(c)
            else:
                res = max(res,len(Q))
                while Q.popleft()!=c:
                    continue
                Q.append(c)
        res = max(res,len(Q))
        
        return res
                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值