美文网首页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

相关文章

  • 最长不重复问题

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

  • 最长不重复子串

    1. 问题定义 最长不重复子串:一个字符串中最长的没有重复字符的子串。举个? : abcabcbb 最长子串 a...

  • 面试常见算法

    最长不含重复字符的子字符串: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例...

  • 阿里面试算法题四

    最长不含有重复串的字符串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1...

  • 算法笔记之动态规划

    LEETCODE 718. 最长重复子数组 问题描述:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长...

  • 2018-12-25

    问题列表 两数之和 两数相加 无重复字符的最长子串 最长回文子串 问题与反馈 总结与收获 要检查一个字符是否已经在...

  • 剑指offer-最长不含重复字符的子字符串-JavaScript

    题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 题目分析 留意最长子串和...

  • Python算法-滑动窗口(Sliding Window)

    滑动窗口 1 减少while循环 2 数组定长问题 3. 无重复字符的最长子串[https://leetcode-...

  • Golang 无重复字符的最长子串

    无重复字符的最长子串

  • 最长重复子数组

    718. 最长重复子数组

网友评论

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

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