面试题48-最长不含重复字符的子字符串

时间:2020-04-15
本文章向大家介绍面试题48-最长不含重复字符的子字符串,主要包括面试题48-最长不含重复字符的子字符串使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目:

找出一个字符序列中一个最长的包含不重复字符的子字符串,计算该最长子字符串的长度。比如在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4。

分析:

找最长优先考虑使用动态规划来解题

动态规划:

待求问题划分为若干个子问题(阶段),按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些可能达到最优的局部解,依次解决各阶段,最后一个子阶段就是初始问题的解。关键找到递推关系

定义函数f(i)为第i个字符为结尾的不包含重复字符的自字符串的子字符串的最长长度,假设我们知道了f(i-1),如果第i个字符在前面没有出现过,则f(i)=f(i-1)+1,

如果第i个字符在前面出现过,d表示第i个字符与它最近一次出现的索引的间隔

如果d<=f(i-1),f(i)=d 表示第i个字符出现两次所夹的子字符串中再也没有其他重复的字符了。

d>f(i-1) f(i)=f(i-1)+1 表示,即使前面出现了,但出现在f(i-1)的最长子字符串之前

正向求解:

“arabcacfr”

f(0)=1    f(1)=f(0)+1

f(2)=2-0=2  f(3)=f(2)+1=3

f(4)=f(3)+1=4 f(5)=3

f(6)=2    f(7)=3

f(8)=4 

代码实现: 

def longSubstringWithoutDuplication(s):
    if len(s)==0 or len(s)==1:
        return len(s)
    curlength=0
    maxlength=0
    dic={} # 存放每一个字符最后一次出现的索引
    for i in range(len(s)):
        # 前面没有出现过,或者出现过,间隔大于前一个字符中最大无重复字符串
        if s[i] not in dic or i-dic[s[i]]>curlength:
            curlength += 1
        else:# 前面出现了,间隔小于前一个字符中最大无重复字符串
            curlength = i-dic[s[i]]
        dic[s[i]]=i
        maxlength=max(curlength,maxlength)
    return maxlength

if __name__ == '__main__':
    s='arabcacfr'
    s1='abcabcbb'
    s2='a'
    print(longSubstringWithoutDuplication(s2))

  

原文地址:https://www.cnblogs.com/shuangcao/p/12706984.html