美文网首页LeetCode笔记
最长不重复问题

最长不重复问题

作者: 只为此心无垠 | 来源:发表于2018-05-13 11:18 被阅读69次

    题目:求最长无重复子串
    从一个字符串中找到一个连续子串,该子串中任何两个字符不能相同,求子串的最大长度并输出一条最长不重复子串。
    输入: "abcdbefdhi"
    输出: "befdhi" 6

    思路

    以如下字符串为例

    abcdbefdhij
    
    

    思路图


    图中的start是一个标志位,表示当前不重复子串的起始位置,图中的数字表示记录字符出现位置的数组hash字典,比如字符b出现在第1位,那么hash_dic['b']=1。顺序扫描字符串,第4个位置时,在hashtable中发现b已经有记录,说明出现过(记出现的位置为k,此时k=1),那么当前的不重复子串长度 = 当前位置-start;下一个不重复子串就应该从第k+1个字符(2号位的c)开始,即令start = 2,并且把[start, k)位置的字符对应的hash字典清空(value置为-1),重新设置b在hash字典里的值为4。继续扫描直到再次发现相同的字符,和前面一样处理。特别注意全部处理完字符串,还要判断一下末尾的不重复子串是否是最长的。

    代码(Python)

    def cal(string):
        dic_hash={}
        start = 0
        res = 0
        arr =[]
        for index in range(0,len(string)):#初始化哈希字典
            dic_hash[string[index]]= -1;
        for index in range(0,len(string)):
            if dic_hash[string[index]] != -1:
                res = max(index-start,res)
                arr = string[start:index]
                last_start = start
                start = dic_hash[string[index]] + 1
                for j in range(last_start,dic_hash[string[index]]):#清空hash字典中start前面的部分
                    dic_hash[string[j]] = -1
            dic_hash[string[index]] = index
        if max(res,len(string)-start)!= res:
            arr = string[start:len(string)]
            res = max(res,len(string)-start)
    
        return arr,res
    
    

    时间复杂度:

    考虑最坏的情况,由于使用了Hash字典, 每个元素访问不超过两次(添加与移除), 所以算法时间复杂度为O(n).[2]

    References

    [1]、 算法(十)-最长无重复字符子串

    [2]、http://www.cnblogs.com/TenosDoIt/p/3736725.html
    [3]、https://my.oschina.net/u/1047616/blog/494543

    相关文章

      网友评论

        本文标题:最长不重复问题

        本文链接:https://www.haomeiwen.com/subject/gnzkdftx.html