题目:给定m个不重复的字符 [a, b, c, d],以及一个长度为n的字符串tbcacbdata,问能否在这个字符串中找到一个长度为m的连续子串,使得这个子串刚好由上面m个字符组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1。比如上面这个例子。
1.双指针+hash
def f(s, s_list):
# 建立hash表保存s_list中元素的个数
d = {m: 0 for m in s_list}
left, right = 0, 0
while right < len(s):
# 先计算[0, len(s_list) - 1]中符合条件的个数
if right < len(s_list) - 1:
if s[right] in s_list:
d[s[right]] += 1
right += 1
if s[right] in s_list and right==len(s_list)-1:
d[s[right]] += 1
else:
# 判断是否符合条件
if sum([1 for m in d if d[m]==1])==len(s_list):
return left, right
else:
# 左右指针都往右移
right += 1
if right < len(s) and (s[right] in s_list):
d[s[right]] += 1
if s[left] in s_list:
d[s[left]] -= 1
left += 1
return -1
print(f("tbcacbdata", ['a', 'b', 'c', 'd']))