美文网首页
华为机考题 | 查找无重复最长子串----Python实现

华为机考题 | 查找无重复最长子串----Python实现

作者: 金融测试民工 | 来源:发表于2020-02-15 17:27 被阅读0次

题目描述

给定一个字符串,请找出其中长度最长且不含有重复字符的子串,计算该子串长度。

输入描述:

输入类型为字符串,例如”abcde“

输出描述:

输出类型为整型, 例如 5

示例1

输入:pwwkew

输出:3

说明:无重复字符的最长子串是"abc",其长度为 3


这道题的解决方案是多种多样的,若下7种:

法1:利用Counter类,最简洁

from collections import Counter

print(len(Counter(list(input()))))

法2:数列去重

new_li=[]

for i in list(input()):

    if i not in new_li:

        new_li.append(i)

print(len(new_li))

法3:类似于动态规划,每次的结果都和上一次的结果相关

s = input()

dp =[1]*len(s)

for i in range(1,len(s)):

    temp = s[i-dp[i-1]:i]

    if s[i]not in temp:

        dp[i]=dp[i-1]+1

    else:

        index = temp.index(s[i])

        dp[i]= i-(index+i-dp[i-1])

print(max(dp))

法4:参考csdn的滑动窗口算法

def lengthOfLongestSubstring(data):

    char_hash = {}

    start,res = 0,0

    for index,val in enumerate(data):

        if val in char_hash and start <= char_hash[val]:

            start = char_hash[val]+ 1

        else:

            res = max(res,index - start + 1)

        char_hash[val]= index

    return res

data = input()

print(lengthOfLongestSubstring(data))

法5:

s = list(input())

hashmap,l,ans = {},0,0

for i,c in enumerate(s):

    if c in hashmap:

        l = min(l + 1,i - hashmap[c])

    else:

        l += 1

    hashmap[c]= i

    ans = max(ans,l)

print(ans)

分两种情况 

1. a...b...a...b, 假设这个字符串没有其他重复字母,那么在最后一个"b"之前,最长无重复子串为"...b...a...",此时读到字符“b”,最长无重复子串变为"...a...b"或"b...a...",即两个"b"之间的字符串(包含首或尾) 

2. b...a...a...b,在最后一个"b"之前,最长无重复子串为"...a...",此时读到字符"b",最长无重复子串变为"...a...b",即“...a...” + “b”. 

综上,最长无重复子串的长度l = min(i - hashmap[s[i]], l + 1) 

我们还需要记录global的最长无重复子串的长度,用另一个变量ans = max(ans, l)来记录即可.

法6:

s = list(input())

l =[]

res,cnt = 0,0

for i in range(len(s)):

    if s[i]not in l:

        l.append(s[i])

        cnt += 1

        res = max(cnt,res)

    else:

        n = l.index(s[i])

        tmp_len = len(l)-n

        l = s[i-tmp_len+1:i+1]

        cnt = tmp_len

print(res)

法7:利用一个字典来保存当前出现的字符在字符串中的index,字符的集合小于ASCII码长度25

strs = input().strip()

maps =[-1 for i in range(257)]

ans = 0

start = 0

maps[ord(strs[0])]= 0

for i in range(1,len(strs)+ 1):

    #遇到字符串结尾时,需要最后一次判断最长子串

    if i == len(strs):

        ans = max(ans,i - start)

        break

    #判断当前字符是否在maps中,如果不为默认值-1即代表在字符串下标i之前已经出现了该字符

    elif maps[ord(strs[i])]!= -1:

        #获取当前的最大字符串长度

        ans = max(ans,i - start)

        #从i之前重复字符串的下标的后一位开始,继续判断

        start = maps[ord(strs[i])]+ 1

    #修改当前字符出现的最新一个index

    maps[ord(strs[i])]= i

# 返回最大字符串长度

print(ans)

相关文章

网友评论

      本文标题:华为机考题 | 查找无重复最长子串----Python实现

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