leetcode3. Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", 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.

Subscribe to see which companies asked this question.


刚接触这道题,最初的思想就是遍暴力搜索:例如字符串"abcabcbb",设置两个遍历compare用来保存当前最长子字符串,ret用来保存历史最长字符串

1.第一遍将子字符串"abc"加入,这是指针指向字符串"abcabcbb"中索引为3的字符,即字符'a'

2.发现字符'a'存在于子字符串字符串"abc"中,因此将compare="abc".然后compare对比ret,如compare长度大于ret,则更新ret,清空compare

3.字符串"abcabcbb"删除第一个元素,继续按照1,2部循环,直到字符串"abcabcbb"为空,返回ret的长度

以下是python代码

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        compare = ''
        ret = ''
        while len(s) > 0:
            for i in range(len(s)):# 循环遍历第一个字符所能产生的最长子字符串
                if s[i] not in compare:
                    compare = compare + s[i]# 如果不存在,则加入
                else:
                    if len(compare) > len(ret):#如果大于以保存的最长子字符串ret,则更新最长子字符串ret
                        ret = compare
                    compare = ''
                    s = s[1:]# 删除第一个字符,继续循环
                    break
        if len(compare) > len(ret):#防止输入的字符串只有一个字符的情况
            ret = compare
        return len(ret)# 返回最长子字符串长度
当然上面的暴力搜索算法会出现超时的问题,因此换一种思路,

同样的例如字符串"abcabcbb",设置两个遍历compare用来保存当前最长子字符串,ret用来保存历史最长字符串

1.第一遍将子字符串"abc"加入,这是指针指向字符串"abcabcbb"中索引为3的字符,即字符'a'

2.发现字符'a'存在于子字符串字符串"abc"中,因此将compare="abc".然后compare对比ret,如compare长度大于ret,则更新ret,清空comapre

3.从字符串"abcabcbb"中找到重复的'a'第一次出现的地方,即索引0,从下一个索引,即索引1开始寻找

4.重复上述步骤,知道所有样本遍历完成,返回ret的长度

以下是python代码

        #正确答案
        compare = ''
        ret = ''
        loop = len(s)# 数组长度
        local = 0# 已访问的元素位置
        i = 0# 当前指向的元素
        while i < loop:
            char = s[i]# 提取当前字符
            if char not in compare:# 如果当前字符不在compare中
                compare = compare + char# 则加入该字符
            else:# 如果当前字符在compare中
                local = s.find(char, local) # 从s中找到该重复点元素索引,从local位置开始找,返回的是该元素全局索引
                local += 1
                # 即s="abcacnf",comapre = "abc",这时i=3,扫描到元素'a','a'存在于compare中,则从s中从local位置开始寻找
                # 找到第一次出现'a'的索引,即索引0,然后令local = 'a'的索引+1
                if len(compare) > len(ret):# 更新ret
                    ret = compare
                compare = ''
                i = local
                continue# 继续寻找
            i += 1
        if len(compare) > len(ret):# 防止s只有一个元素的情况
            ret = compare
        ret = len(ret)
        return ret




你可能感兴趣的:(LeetCode,python,python,算法)