思路,分治法。把字符串按照不符合条件的字符进行分割,最后剩下的最长的那段就是答案
思路其实比较简单,但是代码比较难理解。尤其是递归寻找的时候何时返回答案。
这里采用字典记录这段字串里的元素个数,如果字典里所有元素的个数都大于k说明符合条件
def longestSubstring(s, k):
def dfs(s, l, r, k):
if r-l+1<k:
return 0
counter = defaultdict(int)
for i in range(l, r + 1):
counter[s[i]] += 1
if min(counter.values()) >= k: #这里符合条件返回
return r - l + 1
maxLength = 0
for i in range(l, r + 1):
if counter[s[i]] < k:
maxLength = max(maxLength, dfs(s, l, i - 1, k))
l = i + 1
if counter[s[r]] >= k: #注意这里判断一下,防止后半段是符合条件的,如果没有会错过
maxLength = max(maxLength, dfs(s, l, r, k))
return maxLength
n = len(s)
return dfs(s, 0, n - 1, k)
简写
def longestSubstring(self, s, k):
"""
:type s: str
:type k: int
:rtype: int
"""
if not s:
return 0
for c in set(s):
if s.count(c) < k:
return max(self.longestSubstring(t ,k) for t in s.split(c))
return len(s)
不使用系统栈
def longestSubstring(self, s, k):
"""
:type s: str
:type k: int
:rtype: int
"""
stack = [s]
res = 0
while stack:
count = defaultdict(int)
s = stack.pop()
for i in s:
count[i] += 1
for j, c in count.items():
if c < k:
stack.extend([t for t in s.split(j)])
break
else:
res = max(res, len(s))
return res