0
点赞
收藏
分享

微信扫一扫

蓝桥杯试题算法训练之字串统计——Python满分解答


字串统计

  • ​​问题描述​​
  • ​​输入格式​​
  • ​​输出格式​​
  • ​​输入输出样例​​
  • ​​输入样例1:​​
  • ​​输出样例1:​​
  • ​​输入样例2:​​
  • ​​输出样例2:​​
  • ​​数据规模和约定​​
  • ​​提示​​
  • ​​解题思路​​
  • ​​条件一​​
  • ​​条件二​​
  • ​​条件三​​
  • ​​代码实现​​
  • ​​90分——只满足条件3​​
  • ​​90分——满足条件1和3​​
  • ​​100分——完美通过测试​​

问题描述

给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。

输入格式

  • 第一行一个数字L。
  • 第二行是字符串S。

(L大于0,且不超过S的长度。)

输出格式

一行,题目要求的字符串。

输入输出样例

输入样例1:

4
bbaabbaaaaa

输出样例1:

bbaa

输入样例2:

2
bbaabbaaaaa

输出样例2:

aa

数据规模和约定

  • n<=60
  • S中所有字符都是小写英文字母。

提示

枚举所有可能的子串,统计出现次数,找出符合条件的那个

解题思路

这题看起来挺简单的,但是如果要拿满分,还有一点点复杂。

给定一个字符串,求它符合条件的子串,,最简单的就是根据字串的长度,把所有子串给取出来,然后把条件套进去找到最符合的子串。

要想让本题拿到满分,就要让子串符合3个条件

条件一

长度大于等于L的出现次数最多的子串(不同的出现可以相交)

条件二

如果有多个,输出最长的

条件三

如果仍然有多个,输出第一次出现最早的

下面来看一下代码实现。

代码实现

90分——只满足条件3

def StringStatistics():
L = int(input())
S = str(input())
Lists = []
for item in range(len(S) - L + 1):
List = S[item : item+L]
Lists.append(List)
# print(Lists)
print(max(Lists, key=Lists.count))

StringStatistics()

这是我一开始写的,想的很简单,但只满足了1个条件,即出现最早的子串

蓝桥杯试题算法训练之字串统计——Python满分解答_字符串

因此,第二次提交时,我考虑了长度大于等于L的出现次数最多的子串

90分——满足条件1和3

def StringStatistics():
L = int(input())
S = str(input())
Lists = []
for iter in range(len(S) - L + 1):
for item in range(len(S) - (L + iter) + 1):
List = S[item : item + L + iter]
Lists.append(List)

# print(Lists)
print(max(Lists, key=Lists.count))

StringStatistics()

这一次,我确实把所有长度大于等于L的字串都找到了,但是,也只拿到了90分

蓝桥杯试题算法训练之字串统计——Python满分解答_leetcode_02


再想想,还差条件2,再次尝试!

当然,除了条件2没有实现,我想到的另一种可能是,最后一个测试点的字符串太长了,导致我调用python内置函数max()时,出现了错误

基于上面的考虑,我对代码做了完善

100分——完美通过测试

def StringStatistics():
L = int(input())
S = str(input())
Lists = []
for iter in range(len(S) - L + 1):
for item in range(len(S) - (L + iter) + 1):
List = S[item : item + L + iter]
Lists.append(List)

# 统计每个字符串出现的次数
result = {}
for item in set(Lists):
result[item] = Lists.count(item)

# 获取出现次数最多的字符串
maxValue = max(result.values())
result = [key for key, value in result.items() if maxValue == value]

# 获取最长的的字符串
maxLenght = 0
for item in result:
Length = len(item)
if Length > maxLenght:
maxLenght = Length
result = [value for value in result if maxLenght == len(value)]

# 获取第一次出现最早的字符串
MinIndex = len(Lists)
for item in result:
Index = Lists.index(item)
if Index < MinIndex:
MinIndex = Index
print(Lists[MinIndex])

StringStatistics()

第三次提交,终于满分了!

蓝桥杯试题算法训练之字串统计——Python满分解答_字符串_03


举报

相关推荐

0 条评论