_2_
发表于 2020-4-23 08:53:11
xiangjianshinan 发表于 2020-4-23 08:36
为什么楼主出题后,你们就马上有答案了。而我还理不清思路呢???
差距不是一般的小呀………………
然后就是 @zltzlt 回的一堆「解答错误」,
这点我深有感触{:10_266:}
March2615
发表于 2020-4-23 10:04:38
fan1993423 发表于 2020-4-22 22:12
bddcbefb 这种bbb是不是子串
子串和子序列是不同的
子串要求是原字符串中一块连续的字符串
子序列只要求从原字符串中按原顺序取出字符组成的即可
xiangjianshinan
发表于 2020-4-23 10:53:04
本帖最后由 xiangjianshinan 于 2020-4-26 14:12 编辑
'''
今天的题目:
找到给定字符串(由小写字符组成)中的最长子串 t ,要求 t 中的每一字符出现次数都不少于 k 。返回 t 的长度。
示例 1:
输入:s = "aaabb", k = 3
输出:3
解释:最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:s = "ababbc", k = 2
输出:5
解释:最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
解题思路:
1、解题意得,需要截取s字符串中的一段连续的子串t。而子串t中的每一个字符出现次数不能少于k次.
2、想到的办法是通过集合来提取s字符串中的每个不重复的元素。
3、计算每个元素的数量,当数量大于等于k时,提取该元素。
4、通过提取的元素进行re模块的操作。
过程如下:
'''
import re
s = "aaabb"
k = 3
def timu382(s,k):
if len(s)==0:
return '没有匹配的信息。' #当S为空时出错的修改20200424 14:58
seta = set(s)# 1、2
research = '['
researcha = ''
for i in seta:
if s.count(i) >= k:
researcha = researcha + i
if researcha.strip() == '': #s = "weitong" k = 2 处理s字符不符合k条件的情况20200426 0822
return '没有匹配的信息。'
research = research + researcha +']{' + str(k) + ",}"
print("research",research)
temps = re.search(research, s).group()
if temps == None:
return '没有匹配的信息。'
else:
print(temps)
for i in researcha: #输入 s = 'ababacb', k = 3 结果有误 2020042614:09
if temps.count(i)<k:
return '没有匹配的信息。'
return len(temps)
print(timu382(s,k))
print(timu382("ababbc",2))
s = "weitong"
k = 2
print(timu382(s,k))
s = 'ababacb'
k = 3
print(timu382(s,k))
print('done!')
楼主:回复的
当 s 为空字符串时出错
已修改~~~
=======================================
修改 当s = "weitong" k = 2 时,不能处理的情况。20200426 0822
大佬辛苦啦!!!
=======================================
#输入 s = 'ababacb', k = 3 结果有误 2020042614:09
Frozen83
发表于 2020-4-23 12:29:20
def P382(s,k):
n = len(s)
limit = len(s)
op = 0
while limit >= k-1:
for i in range(n-limit):
t = s
set1 = set(t)
for each in set1:
if t.count(each) < k:
break
else:
op = 1
break
if op == 1:
break
limit -= 1
if op == 1:
return len(t)
else:
return 0
s = input()
k = int(input())
print(P382(s,k))
萌新请大佬赐教
旅途Z
发表于 2020-4-23 13:23:27
有点像 二分法?2333
def max_sub_str(sub_string, k):
length = len(sub_string)
if length < k:
return 0
for each in sub_string:
if sub_string.count(each) < k:
new_head = sub_string.find(each)
return max(max_sub_str(sub_string[:new_head], k), max_sub_str(sub_string,k))
else:
return length
fan1993423
发表于 2020-4-23 14:18:35
March2615 发表于 2020-4-23 10:04
子串和子序列是不同的
子串要求是原字符串中一块连续的字符串
子序列只要求从原字符串中按原顺序取出字 ...
这样啊
findland
发表于 2020-4-23 15:04:48
def f382(s, k):
char_list = set(s)
res = 0
for i in char_list:
if s.count(i) >= k:
res += s.count(i)
return res
if __name__ == "__main__":
s = 'ababbc'
k = 2
print(f382(s, k))
s = "aaabb"
k = 3
print(f382(s, k))
zltzlt
发表于 2020-4-23 18:34:18
TJBEST 发表于 2020-4-22 20:15
就26个字母所以递归深度最大不超过30,超不超时不知道,但是正确性我觉得没问题
33 ms
zltzlt
发表于 2020-4-23 18:36:12
风魔孤行者 发表于 2020-4-22 20:17
解答错误
输入:s = 'ababacb', k = 3
输出:6
预期结果:0
子串一定要是连续的
zltzlt
发表于 2020-4-23 18:37:17
ouyunfu 发表于 2020-4-22 20:29
当 s 为空时出错
zltzlt
发表于 2020-4-23 18:50:08
kinkon 发表于 2020-4-22 20:31
优化递归深度1
用时分别是 33 ms、72 ms、27 ms
zltzlt
发表于 2020-4-23 18:50:55
NAMELESSONE 发表于 2020-4-22 20:37
解答错误
输入:s = 'aaabbb', t = 3
输出:1
预期结果:6
kinkon
发表于 2020-4-23 18:52:38
zltzlt 发表于 2020-4-23 18:50
用时分别是 33 ms、72 ms、27 ms
收到,第二个反而慢了啊
zltzlt
发表于 2020-4-23 18:55:58
March2615 发表于 2020-4-22 21:35
第一段代码超时,第二段代码 20 ms
zltzlt
发表于 2020-4-23 18:57:01
liuzhengyuan 发表于 2020-4-22 21:06
输入以下数据超出时间限制:
s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
t = 1
March2615
发表于 2020-4-23 20:21:41
zltzlt 发表于 2020-4-23 18:55
第一段代码超时,第二段代码 20 ms
果然还是需要优化的
希望能多一点示例,这样测试起来也比较容易找漏
风魔孤行者
发表于 2020-4-23 22:17:53
zltzlt 发表于 2020-4-23 18:36
解答错误
输入:
def f(s,k):
list1 = []
a = 0
while a < len(s):
if s.count(s)<k:
a += 1
else:
b = a+1
while b<len(s) and s.count(s)>=k:
b +=1
list1.append(s)
a = b
list1.sort(key=lambda x:len(x), reverse=True)
for each in list1:
list2 = set(each)
judge = True
for n in list2:
if each.count(n)<k:
judge = False
if judge:
return len(each)
return 0
zltzlt
发表于 2020-4-24 13:26:13
whosyourdaddy 发表于 2020-4-22 21:31
def func382(s,k):
temp = set(s)
l = []
输入 s = "aaabbb", k = 3 时结果有误
zltzlt
发表于 2020-4-24 13:27:02
Python3005 发表于 2020-4-22 22:28
输入 s = "aaabbb", k = 3 时出错
zltzlt
发表于 2020-4-24 13:28:10
Joy187 发表于 2020-4-22 22:37
def func382(s,k):
c=[]
d=*26
输入 s = "ababacb", k = 3 时结果有误